![]() |
gzip decompression, browser (delphi)
вопрос:
есть html страница... скажем zalil.ru (для примера) ответ от сервера при её запросе выглядит так: Код:
HTTP/1.1 200 OKКод:
HTTP/1.1 200 OK1. Откуда считать начало gzip тела (которое длинной 6da) - с начала строки, следующей за строкой с размером и до строки с нулем без учета символов переноса строки перед нулем? 2. как конвертнуть текст gzip обратно в нормальный? ф-цией (из либы ZLibEx) Код:
function DecompressString(const aString: string): string;reply:=copy(reply,pos('6da',reply)+3,1754); //1745 это 6da где reply - изначально полученный мной от сервера ответ. Прошу показать как с этим справиться конкретно на примере страницы zalil.ru, т.к. она маленькая + неизменяющаяся. Но можно и на любой другой ps. вожусь с этой *ней уже часов 6. за реальную помощь в решении вопроса преобразования gzip в обычный текст при использовании сокетов (никаких компонет, никакого инди - мне 1000-1500 потоков надо - инди убьет себя) с меня +20 |
Пробуй передавать на вход своей функции не переменную типа String, а какую-нибудь переменную типа TMemoryStream, так как String не сможет сохранить в себе все символы, которые передает тебе сервер.
|
так... окей.
Начало блока gzip - пара байт: 0x1f,0x8b (так подсказал RFC 1952) длинна блока... наверное 6da (или любая другая хекс-цифра, которая идет перед шифроблоком и вероятно обозначает его длинну) тем не менее, как я не варьирую длинну блока (исходя из того, что первый символ блока - 0x1f) - все равно получаю "data error" :-( Chrome~ - хз.. ф-ция, что я указал (найденная в гугле) вроде как работает именно с переменной string. хотя фиг его знает что тут как, если быть до конца точным |
http://en.wikipedia.org/wiki/Chunked_transfer_encoding
то есть Код:
aКод:
<тут A символов><тут 6da символов> |
Цитата:
Дело в том, что основные "тесты" я провожу, конечно же, не на паге zalil.ru. Та пага, где я тестюсь идет не chunked а единым блоком...( и увы преобразовать её (как и любую другую, не-chunked) из gzip в обычный текст обозначенный выше ф-цией не получается (почему именно - фиг его знает. "data error") было бы супер, если бы гашелся кто-то, ко когда-нибудь реализовывал комбинацию delphi+windows_sockets+gzip |
Мож баг в распаковщике? Ты попробуй полученный код распаковать в php
и если удастся, нормально, значит баг в модуле |
Распаковка gzip (взято отсюда - http://www.rsdn.ru/forum/winapi/2171857.flat.aspx):
Код:
может учитывал лишние \r\n символы? |
Цитата:
Знаешь ли, не всегда просто перевести код (который не понимаешь) с одного языка, который плохо понимаешь на другой, который, пусть даже, и знаешь более менее неплохо. |
delphi zlib 1.2.3.2009
# zlib version 1.2.3 for delphi 5, 6, 7, 8, 2005, 2006, 2007, 2009 # now supports simple gzip files # includes zlib source code and c++ builder 6 project files (c++ builder 6 was used to compile c source into object files) http://www.base2ti.com/zlib.htm |
можно гору обойти:
в заголовок-запроса напиши так чтоб сервер не паковал данные |
| Время: 07:33 |