Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > ICS + gzip (zlib)


Автор: Akella 10.9.2010, 15:30
Некоторые сайты отдают контент в сжатом виде. Я не могу понять, как мне заставить компоненту THttpCli "разжать" контент или получать уже "разжатый" контент.

Автор: Matematik 10.9.2010, 18:35
В synaptic просто получал в AnsiString пожатую страницу, проверял заголовок "Content-Encoding: gzip", сигнатуру #$1F#$8B#$08#$00
и распаковывал ф-ей GZDecompressStr() из библиотеки http://www.base2ti.com/?id=delphi.zlib

Код

function IsGZipData(const AData: AnsiString): Boolean;
begin
  // if  Copy(buf,1,4)=#$1F#$8B#$08#$00 then
  Result := (Length(AData)>4) and (PInteger(AData)^=$00088B1F);
end;


В случае ошибки GZDecompressStr() вызывает исключение, бывает сервера шлют битый gzip, тогда делал еще один запрос без заголовка "Accept-Encoding: gzip", соответственно получал несжатую страницу. 

PS
в библиотеке есть ошибка - если размер упакованных данных ==ноль - получаю AV, т.к. нет проверки переменной size
написал автору письмо, но пока без изменений
вот этот кусочек
Код

procedure GZDecompressString(var result: AnsiString; const s: RawByteString;
  var fileName, comment: AnsiString; var dateTime: TDateTime);
var
  index: Integer;
  crc  : Longint;
  size : Integer;
begin
  result := '';
  GZInitializeDecompressString(s, fileName, comment, dateTime, index);
  size := Length(s) - SizeOf(TGZTrailer) - index + 1;
  ZDecompressString2(result, Copy(s, index, size), GZ_ZLIB_WINDOWBITS);
  size := Length(result);
  if size>0 then // этой проверки не было
  begin
    crc := ZCrc32(0, result[1], size);
    GZFinalizeDecompressString(s, crc, size);
  end;
end;

Автор: Akella 10.9.2010, 22:18
кошмар... но в ICS должны быть родные способы работы со сжатым контентом

Автор: Matematik 11.9.2010, 09:30
Глянул одним глазом ics, нашел файлик OverbyteIcsHttpCCodZLib.pas, и судя по исх. коду его надо просто добавить в uses.

Автор: Akella 13.9.2010, 08:58
Да, 2 файла (OverbyteIcsZlib.inc и OverbyteIcsHttpCCodZLib.pas) нужно закинуть в папку, где все dcu этой библиотеки хранятся и прописать OverbyteIcsHttpCCodZLib в USES.

Matematik, +1, спасибо  smile 

Автор: Akella 13.9.2010, 16:55
Ничего не пойму. Работал код, работал и вот те на. Резко всё вернулось на круги своя.
В USES OverbyteIcsHttpCCodZLib не убирал. Опять ICS(HttpCli) не распаковывает полученный контент   smile  smile  smile 

Автор: RA 4.10.2010, 01:04
Цитата(Akella @  13.9.2010,  16:55 Найти цитируемый пост)
Ничего не пойму. Работал код, работал и вот те на. Резко всё вернулось на круги своя.
В USES OverbyteIcsHttpCCodZLib не убирал. Опять ICS(HttpCli) не распаковывает полученный контент 



Если в HttpCli собираешься использовать Gzip то не забудь включить тумблер 

Код


 HttpCli.Options  := [httpoEnableContentCoding];


Автор: Akella 11.10.2010, 10:32
RA, а если его включить и оставить включенным постоянно для всех (разных) сайтов? Можно так?

Автор: RA 16.11.2010, 16:02
Цитата(Akella @  11.10.2010,  10:32 Найти цитируемый пост)
а если его включить и оставить включенным постоянно для всех (разных) сайтов? Можно так? 


Эт не знаю не проверял.

Добавлено @ 16:11
ps: Некоторые провайдеры сами разжимают входящий к клиенту гзип трафик, а некоторые нет, так что тут может оказать очень серьёзная подстава ... поэтому на всякий случай сделаю тут маленькую рекламку 
http://www.fiddler2.com Web debugging proxy

Автор: Akella 16.11.2010, 16:15
Цитата(RA @  16.11.2010,  16:02 Найти цитируемый пост)
случай сделаю тут маленькую рекламку 

Ты уж тогда опиши, что это и с чего его едят.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)