B
Bgag
Hallo!
War wohl mal wieder etwas daneben. Tut mir Leid weiß auch nicht, was im Moment mit mir los ist. Eigentlich sollte die neue Methode aber richtig sein, aber irgendwie stimmt da etwas nicht. Ich habe deine Methode divideReply() so angepasst, sodass das "c" am Anfang des Responses nicht weggeschnitten wird, da das ja bereits meine erste Chunk-Größe im Hexacode ist. Der Inhalt von $parsed['CONTENT'] sieht also nun so aus:
Das habe ich auch mit einer Testausgabe überprüft. Die neue Methode decodeChunked() erwartet nun das ganze Array $parsed. Die Verarbeitung findet zwar statt, allerdings ist $parsed['CONTENT'] nach dieser Methode leer. ich weiß leider nicht wo mein Fehler liegt. Ich schicke hier mal beide Methoden divideReply() und decodeChunked mit.
MfG, Andy
divideReply()
decodeChunked()
War wohl mal wieder etwas daneben. Tut mir Leid weiß auch nicht, was im Moment mit mir los ist. Eigentlich sollte die neue Methode aber richtig sein, aber irgendwie stimmt da etwas nicht. Ich habe deine Methode divideReply() so angepasst, sodass das "c" am Anfang des Responses nicht weggeschnitten wird, da das ja bereits meine erste Chunk-Größe im Hexacode ist. Der Inhalt von $parsed['CONTENT'] sieht also nun so aus:
Code:
c
Hello world!
0
MfG, Andy
divideReply()
PHP:
/**
* divideReply() - Spilts up the reply into the different information
*
* @access: private
* @param Str $reply
* @return Array
*/
private function divideReply( $reply )
{
if( !preg_match('/^HTTP\/(1\.[01]) ([1-5][0-9]{2})/', $reply, $match) )
{
return false;
}
$hb = strpos($reply, "\r\n")+2;
$cb = strpos($reply, "\r\n\r\n")+4;
$parsed = array(
'HTTP_VERSION' => $match[1],
'STATUS_CODE' => $match[2],
'HEADER_FIELDS' => array(),
'CONTENT' => (string) substr($reply, $cb)
);
$headerFields = explode("\r\n", preg_replace('/\x0D\x0A[\x09\x20]+/', ' ', substr($reply, $hb, $cb-$hb-4)));
foreach( $headerFields as $headerField )
{
if( preg_match('/([^:]+):(.+)/m', $headerField, $match) )
{
$parsed['HEADER_FIELDS'][$this->getName($match[1])] = trim($match[2]);
}
}
if( isset($parsed['HEADER_FIELDS']['Transfer-Encoding']) && $parsed['HEADER_FIELDS']['Transfer-Encoding'] == 'chunked' )
{
$return = $this->decodeChunked($parsed);
}
else
{
$return = $parsed;
}
return $return;
}
decodeChunked()
PHP:
/**
* decodeChunked() - Decodes body in chunked encoding
*
* @access: private
* @param Arr $chunked
* @return Array
*/
private function decodeChunked($chunked)
{
$body = '';
$length = NULL;
$size = NULL;
// save chunked body to a variable
$chunk = $chunked['CONTENT'];
while(true)
{
// get next occurrence of CRLF
$pos = @strpos($chunk, "\r\n", 0);
if(!($pos === false) && $size === NULL)
{
// get the size of following chunk from hex
$size = hexdec(substr($body, 0, $pos));
// get the following chunk
$body .= substr($chunk, $pos+2, $size);
// update the content not encoded
$chunk = substr($chunk, $pos+2+$size);
// update content-length
$length += $size;
// reset chunk-size
$size = NULL;
}
else
{
// leave loop
break;
}
}
// set right Content
$chunked['CONTENT'] = $body;
// set right Content-Length
$chunked['HEADER_FIELDS']['Content-Length'] = $length;
// change Transfere-Encoding
$chunked['HEADER_FIELDS']['Transfer-Encoding'] = 'token';
return $chunked;
}