Как декодировать HTML в кодировке gzip? - PullRequest
2 голосов
/ 22 декабря 2011

Я получил данные с веб-сервера:

data := '
HTTP/1.1 200 OK
Content-Encoding: gzip
Vary: Accept-Encoding
Content-type: text/html
Transfer-Encoding: chunked
Server: Apache

3d5
????????????????????????????????????
????????????????????????????????????
????????????????????????????????????
';

Размер данных: 3d5 (в шестнадцатеричном формате). Все данные хранятся в переменной TIdBytes «data».

Как декодировать gzipedданные, измените что-то в нем, закодируйте и отредактируйте длину 3d5 до новой.

Ответы [ 2 ]

6 голосов
/ 22 декабря 2011

Заголовок ответа Transfer-Encoding установлен на chunked. Это означает, что сервер отправляет данные тела в чанках, где каждый чанк указывает свой собственный размер, а чан нулевой длины указывает конец данных. 3d5 относится к размеру первого блока. Это будет полный размер HTML только в том случае, если в ответе будет только 1 кусок данных.

TIdHTTP внутренне обрабатывает фрагментированные данные для вас. Если распакованные данные были gzip'ped, TIdHTTP может распаковать их для вас, если вы заранее назначите компонент TIdZLibCompressorBase, например TIdCompressorZLib, свойству TIdHTTP.Compressor.

1 голос
/ 04 июня 2014

Вы можете распаковать сжатое тело http с помощью функции GZDecompressStr() единицы ZlibExGz .Просто передайте данные, в точности как вы получите их из ответного сообщения http, в качестве параметра, и он вернет распакованные данные.

uses ZlibExGz;

var s:string;

begin
 // read the gzipped data in "s"
 s:=GZDecompressStr(s);
 // now "s" contains uncompressed data
end;
...