¿Cómo descodificar fácilmente una cadena codificada en HTTP al realizar una solicitud HTTP sin procesar?

Quiero hacer una solicitud HTTP sin tener que depender de cURL yallow_url_fopen = 1 abriendo la conexión de socket y enviando una solicitud HTTP sin procesar:

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

La función funciona bien, pero como estoy usando HTTP / 1.1, el cuerpo de la respuesta generalmente se devuelve enCodificado en trozos cuerda. Por ejemplo (de Wikipedia):

25
This is the data in the first chunk

1C
and this is the second one

3
con
8
sequence
0

No quiero usarhttp_chunked_decode() Ya que tiene dependencia PECL y quiero un código altamente portátil.

¿Cómo decodificar fácilmente una cadena codificada en HTTP para que mi función pueda devolver el HTML original? También tengo que asegurarme de que la longitud de la cadena decodificada coincida con laContent-Length: encabezamiento.

Cualquier ayuda sería apreciada. Gracias.

Respuestas a la pregunta(3)

Su respuesta a la pregunta