PHP Australia Conference 2015

http_chunked_decode

(PECL pecl_http >= 0.1.0)

http_chunked_decodeDécode un fragment de donnée encodé

Description

string http_chunked_decode ( string $encoded )

Décode un fragment de chaîne encodée.

Liste de paramètres

encoded

Fragment de chaîne encodée

Valeurs de retour

Retourne la chaîne décodée en cas de succès ou FALSE si une erreur survient.

Exemples

Exemple #1 Exemple avec http_chunked_decode()

<?php
$string 
"".
    
"05\r\n".
    
"this \r\n".
    
"07\r\n".
    
"string \r\n".
    
"12\r\n".
    
"is chunked encoded\r\n".
    
"01\n\r\n".
    
"00";
echo 
http_chunked_decode($string);
?>

L'exemple ci-dessus va afficher :

this string is chunked encoded

add a note add a note

User Contributed Notes 1 note

up
0
Marques Johansson
5 years ago
Here's a PHP implementation for those less interested in installing a pecl module.  It's a bit naive (doesn't handle multiple byte encodings), but it works.  I'm also including my is_hex() implementation at no additional cost.

<?php
if (!function_exists('http-chunked-decode')) {
   
/**
     * dechunk an http 'transfer-encoding: chunked' message
     *
     * @param string $chunk the encoded message
     * @return string the decoded message.  If $chunk wasn't encoded properly it will be returned unmodified.
     */
   
function http_chunked_decode($chunk) {
       
$pos = 0;
       
$len = strlen($chunk);
       
$dechunk = null;

        while((
$pos < $len)
            && (
$chunkLenHex = substr($chunk,$pos, ($newlineAt = strpos($chunk,"\n",$pos+1))-$pos)))
        {
            if (!
is_hex($chunkLenHex)) {
               
trigger_error('Value is not properly chunk encoded', E_USER_WARNING);
                return
$chunk;
            }

           
$pos = $newlineAt + 1;
           
$chunkLen = hexdec(rtrim($chunkLenHex,"\r\n"));
           
$dechunk .= substr($chunk, $pos, $chunkLen);
           
$pos = strpos($chunk, "\n", $pos + $chunkLen) + 1;
        }
        return
$dechunk;
    }
}

   
/**
     * determine if a string can represent a number in hexadecimal
     *
     * @param string $hex
     * @return boolean true if the string is a hex, otherwise false
     */
   
function is_hex($hex) {
       
// regex is for weenies
       
$hex = strtolower(trim(ltrim($hex,"0")));
        if (empty(
$hex)) { $hex = 0; };
       
$dec = hexdec($hex);
        return (
$hex == dechex($dec));
    }
?>
To Top