Fehler in Http-Klasse

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:
Code:
c  
Hello world!
0
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()
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;
	}
 
Hier ist der Fehler:
PHP:
// get the size of following chunk from hex
$size = hexdec(substr($body, 0, $pos));
 
Oh mist ich Depp. Entschuldigt, aber das ist echt dämlich. Kann es zwar jetzt nicht testen, da ich mal wieder nicht zuhause bin, aber $body ist am Anfang ja leer, da ich da ja den dekodierten Content reinspeichern möchte. Ich muss $body also durch $chunk ersetzen, da dort ja der Content in der Chunk-Codierten Version vorliegt. Dann findet das Script auch eine Größe.
PHP:
// get the size of following chunk from hex
$size = hexdec(substr($chunk, 0, $pos));
Werde die Klasse die Tage nochmal ausführlich testen, aber jetzt sollte sie fertig sein. Da würde mir echt ein Stein vom Herzen fallen. HTTP istdeutlich komplexer als zum Beispiel FTP oder ähnliches. Naja aber man soll sich ja nicht zu früh freuen. Erst muss die Klasse ausführlich getestet werden.
MfG, Andy
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück