Jak łatwo zdekodować zakodowany HTTP kodowany łańcuch podczas tworzenia surowego żądania HTTP?
Chcę tworzyć żądania HTTP bez zależności od cURL iallow_url_fopen = 1
otwierając połączenie z gniazdem i wysyłając surowe żądanie HTTP:
/**
* Make HTTP GET request
*
* @param string the URL
* @param int will be filled with HTTP response status code
* @param string will be filled with HTTP response header
* @return string HTTP response body
*/
function http_get_request($url, &$http_code = '', &$res_head = '')
{
$scheme = $host = $user = $pass = $query = $fragment = '';
$path = '/';
$port = substr($url, 0, 5) == 'https' ? 443 : 80;
extract(parse_url($url));
$path .= ($query ? "?$query" : '').($fragment ? "#$fragment" : '');
$head = "GET $path HTTP/1.1\r\n"
. "Host: $host\r\n"
. "Authorization: Basic ".base64_encode("$user:$pass")."\r\n"
. "Connection: close\r\n\r\n";
$fp = fsockopen($scheme == 'https' ? "ssl://$host" : $host, $port) or
die('Cannot connect!');
fputs($fp, $head);
while(!feof($fp)) {
$res .= fgets($fp, 4096);
}
fclose($fp);
list($res_head, $res_body) = explode("\r\n\r\n", $res, 2);
list(, $http_code, ) = explode(' ', $res_head, 3);
return $res_body;
}
Funkcja działa poprawnie, ale ponieważ używam HTTP / 1.1, treść odpowiedzi zwykle jest zwracanaZakodowane kodowane strunowy. Na przykład (z Wikipedii):
25
This is the data in the first chunk
1C
and this is the second one
3
con
8
sequence
0
Nie chcę używaćhttp_chunked_decode()
ponieważ ma zależność PECL i chcę bardzo przenośnego kodu.
Jak łatwo zdekodować zakodowany HTTP kodowany ciąg, aby moja funkcja mogła zwrócić oryginalny kod HTML? Muszę również upewnić się, że długość zdekodowanego ciągu pasuje doContent-Length:
nagłówek.
Każda pomoc byłaby doceniana. Dzięki.