Как принимать gzip страницы при чтении из сокета?

mutex

Guest
Как принимать gzip страницы при чтении из сокета?

Открываю страницу с помощью fsockopen, а сервер возвращает страницу с Content-Encoding: gzip. Внимание, вопрос: как прочитать данные?
Спасибо.
 

DiMA

php.spb.ru
Команда форума
К большому сожалению функция, которая приложена в комментах function gzdecode($data), периодически глючит и ничего не распаковывает. А встроенной в пхп функции нет, прямо идиотизм какой-то... ob_gzhandler и gzencode() есть, а обратной распаковки - нет.

Пример глюка gzdecode на URL http://mail.rambler.ru/&from=topmenu (выдают 404, а тело документа не распаковать).

Warning: gzinflate(): buffer error on line:

$body = substr($data,$headerlen,$bodylen);
$data = "";
if ($bodylen > 0) {
switch ($method) {
case 8:
// Currently the only supported compression method:
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
$data = gzinflate($body);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
break;
default:
// Unknown compression method
return false;
}

Впрочем, смысл всей функции можно свести до 2х строк:
$data = substr($data, 10);
return gzinflate($data);

Толи пинять надо самих себя, т.к. неверные данные в gzinflate суем, либо она сама по себе глючит...

Эта проблема является открытым багом пхп уже почти 3 года
http://bugs.php.net/bug.php?id=22123&edit=1

Где, кстати, книга рекордов Гиннеса? :)

-~{}~ 12.12.05 11:09:

Я нашел в чем проблема. Последние 4 байта полученного документа являются длинной данных после распаковки. Соответсвенно кривым тут является рамблер, т.к. он выдает мусор в последних 4 байтах, что дает размер более 1Гига. Но фишка в том, что Опера и ИЕ в состоянии нормально распаковать даже такой кривой файл. Если вписать правильную длину, файл, наверно распакуется. Остается только ее узнать или подобрать... В самом скаченном документе длины данных после распаковки естественно больше нигде не написано.
 

white phoenix

Новичок
PHP:
   header("Content-Encoding: ".$ENCODING."");  	
   print "\x1f\x8b\x08\x00\x00\x00\x00\x00"; 
   $Size = strlen($Contents);
   $Crc = crc32($Contents); 
   $Contents = gzcompress($Contents,$this->level); 
   $Contents = substr($Contents, 0, strlen($Contents) - 4); 
   print $Contents; 
   print pack('V',$Crc);  // !!!
   print pack('V',$Size);  // !!!
действительно, последние 4 байта это длина.
 

disc

Guest
Скажите а разьве когда передаешь заголовки в запросе сокетами можно указать что не хочешь получать в gzip данные, чтоб сервер слал plain/text данные
 
Сверху