IdHTTPServer i kompresja stron

Odpowiedz Nowy wątek
2006-11-28 08:55
hes
0

Witam,
Prawdopodobnie mój problem dotyczy bardziej znajomości działania przeglądarek niż samego Delphi, ale z braku innych opcji postanowiłem napisać tutaj.
Istniejący i działający serwer www napisany w Delphi z wykorzystaniem IdHTTTPServer służy do przesyłania dość dużych stron, których czas ładowania nie jest zadowalający, dlatego naturalnym rozwiązaniem wydaje się być kompresja stron.
Zastosowałem IdCompressorZLibEx i niby wszystko działa na wszystkich przeglądarkach... za wyjatkiem IE. W IE6 pojawia się biały ekran, w IE7 standartdowe "Internet Explorer cannot display the webpage".

Fragment kodu:

      StreamIn:=TStringStream.Create(ContentText);
      StreamOut:=TMemoryStream.Create;
      with TIdCompressorZLibEx.Create do begin
        CompressHTTPDeflate(StreamIn,StreamOut,1);
        Free;
      end;
      StreamIn.Free;
      AResponseInfo.ContentStream:=StreamOut;
      AResponseInfo.ContentType:='text/html; charset=windows-1250';
      AResponseInfo.ContentEncoding:='deflate';

Nagłówki:

GET / HTTP/1.1Accept: */*Accept-Language: plUA-CPU: x86Accept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)Host: localhost:8887Connection: Keep-Alive

HTTP/1.1 200 OKConnection: closeContent-Encoding: deflateContent-Type: text/html; charset=windows-1250Content-Length: 375Server: Indy/10.1.3Set-Cookie: IDHTTPSESSIONID=jXIxqgfpCovB9QM; path=/

Nie mogę nie liczyć się z Micro$oftowym tworem, więc będę wdzięczny za wszelkie pomysły i sugestie.

Pozostało 580 znaków

2006-11-30 14:26
hes
0

Dla zainteresowanych przesyłam rozwiązanie.
Okazało się, że IE (jako jedyna przeglądarka) nie toleruje stron skompresowanych w formacie zwróconym przez CompressHTTPDeflate. Różnica między tym formatem, a akceptowanym przez IE występuje w nagłówku (kilku pierwszych bajtach skompresowanych danych). Wystarczy te dane podmienić w strumieniu jak poniżej:

procedure THttpServer.Compress(AResponseInfo: TIdHTTPResponseInfo);
var
  StreamTmp: TStream;
  Compressor: TIdCompressorZLibEx;
begin
  StreamTmp:=TMemoryStream.Create;
  AResponseInfo.ContentStream.Seek(0,0);
  Compressor:=TIdCompressorZLibEx.Create;
  try
    Compressor.CompressHTTPDeflate(AResponseInfo.ContentStream,StreamTmp,9);
  except
    Compressor.Free;
    StreamTmp.Free;
    Exit;
  end;
  Compressor.Free;
  AResponseInfo.ContentStream.Free;
  AResponseInfo.ContentStream:=TStringStream.Create(#$1F#$8B#8#0#0#0#0#0#0#0);
  AResponseInfo.ContentStream.Seek(0,2);
  StreamTmp.Seek(2,0);
  AResponseInfo.ContentStream.CopyFrom(StreamTmp,StreamTmp.Size-2);
  StreamTmp.Free;
  AResponseInfo.ContentEncoding:='gzip';
end;

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0