Wie kann man eine HTTP-chunked-codierte Zeichenfolge einfach decodieren, wenn eine HTTP-Rohanforderung gestellt wird?

Ich möchte eine HTTP-Anfrage stellen, ohne von cURL und abhängig zu seinallow_url_fopen = 1 durch Öffnen der Socket-Verbindung und Senden einer unformatierten HTTP-Anfrage:

/**
 * 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;
}

Die Funktion funktioniert einwandfrei, aber da ich HTTP / 1.1 verwende, wird der Antworttext normalerweise in zurückgegebenChunked-codiert Zeichenfolge. Zum Beispiel (aus Wikipedia):

25
This is the data in the first chunk

1C
and this is the second one

3
con
8
sequence
0

Ich möchte nicht verwendenhttp_chunked_decode() da es PECL-Abhängigkeit hat und ich einen hoch portierbaren Code möchte.

Wie kann ich eine HTTP-chunked-codierte Zeichenfolge einfach decodieren, damit meine Funktion den ursprünglichen HTML-Code zurückgeben kann? Ich muss auch sicherstellen, dass die Länge der dekodierten Zeichenfolge mit der übereinstimmtContent-Length: Header.

Jede Hilfe wäre dankbar. Vielen Dank.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage