Декодирование HTTP-фрагментов + сжатый контент - PullRequest
2 голосов
/ 12 октября 2011

Как бы расшифровать ответ сервера, который

1) передача-кодирование: chunked 2) тип контента: gzip

Мне нужно сделать это вручную, и я не могу просто использовать curl для отправки запроса. Мне нужно декодировать из необработанной строки $.

Вот функция, которая должна отсоединить ответ HTTP (php):

function unchunkHttpResponse($str=null) {
if (!is_string($str) or strlen($str) < 1) { return false; }
$eol = "\r\n";
$add = strlen($eol);
$tmp = $str;
$str = '';
do {
    $tmp = ltrim($tmp);
    $pos = strpos($tmp, $eol);
    if ($pos === false) { return false; }
    $len = hexdec(substr($tmp,0,$pos));
    if (!is_numeric($len) or $len < 0) { return false; }
    $str .= substr($tmp, ($pos + $add), $len);
    $tmp  = substr($tmp, ($len + $pos + $add));
    $check = trim($tmp);
    } while(!empty($check));
unset($tmp);
return $str;
}

Но, похоже, он не работает с содержимым gzipped (gzinflate отсутствует в этом фрагменте). Я попытался сделать gzinflate для возвращаемого контента, но это не работает вообще.

Есть идеи? Или как gzip + передача кодирования chunked работает вместе?

Спасибо

1 Ответ

0 голосов
/ 14 октября 2011

Не могли бы вы начать с проверки того, что эта функция действительно правильно агрегирует фрагментированный ответ, сравнивая его с каким-либо текстовым ответом.Я не очень разбираюсь в php, поэтому не могу точно сказать, будет ли эта функция работать, но поскольку ответ gzipped будет двоичным, мне интересно, можно ли объединить его в строку, и это нормально.И не могли бы вы объяснить, почему вам нужно "декодировать из необработанной строки $"?Почему использование какого-либо клиента, который, как доказано, правильно обрабатывает все детали HTTP, и раздувание того, что он возвращает, не работает для вас?

...