-
Добрый всем день. Судя по тому, что прочитал, gzip сжатие не реализовано при отправке данных из TidHTTPServer. Скажите - может быть кто-то видел реализацию?
-
Какую ты хочешь реализацию? Чтоб он на лету все сам сжимал что ли? Делается ведь элементарно, берешь TCompressionStream из IdZLib загоняешь в него данные и отправляешь его как ответ, не забывая добавить соответствующий заголовок в ответ сервера (предварительно проверив заголовки запроса клиента, есть ли там поддержка сжатия клиентом).
-
Еще проще с TIdCompressorZLib из IdCompressorZLib будет Условно делать так:
procedure TfrmMain.HTTPServerCommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
TmpStream: TStream;
begin
TmpStream := TFileStream.Create(....);
try
IdCompressorZLib.CompressHTTPDeflate(TmpStream, AResponseInfo.ContentStream, 4);
IdCompressorZLib.CompressStream(TmpStream,AResponseInfo.ContentStream,9,GZIP_WIN BITS,9,0);
finally
TmpStream.free;
end;
end;
-
>Какую ты хочешь реализацию? Чтоб он на лету все сам сжимал что ли?
ну как - на лету... как-то так - как ты пишешь в [2], спасибо за затравку, посмотрю, что получится, если во что-то совсем упрусь, стукну.
Спасибо за ответы, постараюсь разобраться.
-
Получилось как-то так, похоже, что работает ок:
if Pos('gzip', ARequestInfo.AcceptEncoding) > 0 then
begin
AResponseInfo.ContentStream := TMemoryStream.Create;
CompressFile;
AResponseInfo.ContentEncoding := 'gzip';
end
else
AResponseInfo.ContentStream := TFileStream.Create(LocalDoc, fmOpenRead or fmShareDenyNone);
AResponseInfo.ContentLength := AResponseInfo.ContentStream.Size;
AResponseInfo.WriteHeader;
AResponseInfo.WriteContent;
AResponseInfo.ContentStream.Free;
AResponseInfo.ContentStream := nil;
procedure CompressFile;
var
TmpStream: TFileStream;
begin
TmpStream := TFileStream.Create(LocalDoc, fmOpenRead or fmShareDenyNone);
try
CompressStream(TmpStream, AResponseInfo.ContentStream, clMax, zsGZip);
finally
FreeAndNil(TmpStream);
end;
end;
uses IdZLib, IdZLibHeaders
|