Конференция "Сети" » Gzip + TidHTTPServer
 
  • OtherSide (07.08.13 10:19) [0]
    Добрый всем день. Судя по тому, что прочитал, gzip сжатие не реализовано при отправке данных из TidHTTPServer. Скажите - может быть кто-то видел реализацию?
  • DVM © (07.08.13 14:04) [1]
    Какую ты хочешь реализацию? Чтоб он на лету все сам сжимал что ли?
    Делается ведь элементарно, берешь TCompressionStream из IdZLib загоняешь в него данные и отправляешь его как ответ, не забывая добавить соответствующий заголовок в ответ сервера (предварительно проверив заголовки запроса клиента, есть ли там поддержка сжатия клиентом).
  • DVM © (07.08.13 14:14) [2]
    Еще проще с 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;

  • OtherSide (08.08.13 00:51) [3]
    >Какую ты хочешь реализацию? Чтоб он на лету все сам сжимал что ли?

    ну как - на лету... как-то так - как ты пишешь в [2], спасибо за затравку, посмотрю, что получится, если во что-то совсем упрусь, стукну.

    Спасибо за ответы, постараюсь разобраться.
  • OtherSide (08.08.13 02:18) [4]
    Получилось как-то так, похоже, что работает ок:


     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
 
Конференция "Сети" » Gzip + TidHTTPServer
Есть новые Нет новых   [134427   +35][b:0][p:0.001]