HTTP - не получается разархивировать gzip

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

HTTP - не получается разархивировать gzip

Сообщение djalex777 » 11.04.2009 (Сб) 18:07

Написал разборщих HTTP-ответа сервера. Выделяю данные из заголовка. Проверяю content-encoding. Если gzip, то пытаю выполнить uncompress с помощью библиотеки zlib.dll. Но uncompress почему-то не может разархивировать данные. Как правильно это сделать? Заметил что вначале gzip данных первой строкой передается какое-то число, а потом уже сами данные. На форуме находил подобную тему, но предоставленные там функции так же не разархивируют данные. Все объявлено и передается функциям в правильном виде. Проблема в самих данных. Может с ними нужно что-то сделать вначале? Или считывать как-то по особенному?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: HTTP - не получается разархивировать gzip

Сообщение iGrok » 11.04.2009 (Сб) 18:40

Число - длина chunk'а данных в HEX. Насколько я понимаю, нужно сначала получить весь блок, а потом уже пытаться разжимать.
Если получится - отпишись, как сделал. Меня этот вопрос тоже сейчас интересует, но пока решение отошло на второй план, а я принудительно шлю серверу пустой "Accept-Encoding", чтобы никаких gzip'ов с compress'ами.

UPD:
Короче, смотри хидер "Transfer-Encoding". И если его значение - "chunked", тогда данные идут в таком формате:

<header>+CRLF+CRLF
HEX(Length(chunk))+CRLF+ChunkData+CRLF
HEX(Length(chunk))+CRLF+ChunkData+CRLF
0+CRLF+CRLF

Нулевая длина чанка - конец контента. Я только не уверен насчёт двух CRLF после него. Впрочем, это легко проверить.
label:
cli
jmp label

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: HTTP - не получается разархивировать gzip

Сообщение iGrok » 23.04.2009 (Чт) 0:34

А хоть кому-то удавалось вообще ражимать gzip-контент, отдаваемый сервером?

Только не надо отправлять в поиск. Я там уже не первый день. =)

viewtopic.php?f=1&t=4431&p=25164
То, что приведено тут в последнем посте - не работает. Точнее, это похоже для deflate, а мне бы gzip..
label:
cli
jmp label

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: HTTP - не получается разархивировать gzip

Сообщение MIT » 23.04.2009 (Чт) 8:10

Fiddler2. Не обфусцирован. Написан на NET`е; можно в рефлекторе посмотреть систему обработки и сделать по аналогии.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: HTTP - не получается разархивировать gzip

Сообщение iGrok » 23.04.2009 (Чт) 12:46

MIT писал(а):Fiddler2. Не обфусцирован. Написан на NET`е; можно в рефлекторе посмотреть систему обработки и сделать по аналогии.

Гм.. Я на него, конечно, посмотрел, но в рефлекторе пока не разобрался. С .net работать особо не приходилось.

Но одно я таки знаю. В .net есть GZipStream, который для этих целей подходит. И я почти уверен, что они юзают именно его. Так что ничем мне это не поможет. (
label:
cli
jmp label

Megas13
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 03.08.2006 (Чт) 9:46
Откуда: IL

Re: HTTP - не получается разархивировать gzip

Сообщение Megas13 » 23.04.2009 (Чт) 16:20

iGrok писал(а):А хоть кому-то удавалось вообще ражимать gzip-контент, отдаваемый сервером?

Я без проблем разжимал gzip-контент. Использовал для этого библеотеку vbzlib.dll
Компьютер не подчиняется законам физики.Только в нем глюки возникают из ничего, файлы исчезают в никуда, а объем измеряется в метрах и называется весом.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: HTTP - не получается разархивировать gzip

Сообщение djalex777 » 23.04.2009 (Чт) 19:21

Да. Есть такая библиотека. Вот только она не скачивалась у меня ни с одного сайта... И тут сегодня она вдруг скачалась. Выкладываю её сюда. С ней действительно всё заработало.
Не chunked страница разжимается просто - берем данные, разбиваем их по vbCrLf. В первой строке длина всех данных в HEX формате. Вычисляем её и из второй строки берем именно столько - это и есть сжатый gzip. Разжимаем с помощью uncompress.
С chunked немного сложнее. Получили в заголовке chunked, значит следующие данные принимаем и соединяем с предыдущими начиная с данных в которых встретился chunked и заканчиваем объединение когда у нас в данных встретится "0" & vbClrFl. Далее расшифровываем по первой схеме, с учетом того что первая строка это длина всех данных, а остальные строки - это данные, которые нужно объединить воедино и взять (начиная с начала) длину всех данных.
Вложения
vbzlib.rar
(31.8 Кб) Скачиваний: 57

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: HTTP - не получается разархивировать gzip

Сообщение iGrok » 23.04.2009 (Чт) 19:53

Megas13 писал(а):
iGrok писал(а):А хоть кому-то удавалось вообще ражимать gzip-контент, отдаваемый сервером?

Я без проблем разжимал gzip-контент. Использовал для этого библеотеку vbzlib.dll

О. Спасибо. )

Как выяснилось, можно разжимать и обычной zlib.dll, но несколько геморно. Может, потом руки дойдут сделать по-человечески. А пока вот:
Вложения
VBZLib_-_G198518442006 + dll.rar
(38.01 Кб) Скачиваний: 69
label:
cli
jmp label


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24

    TopList  
cron