Fehler in Http-Klasse

Hallo!
Also wenn ich das richtig verstanden habe dann wird der Content in kleine Blöcke (Chunks) unterteilt, vor denen jeweils ihre Größe in Bytes in Hexacode, gefolgt von einem CRLF (\r\n), stehen. Abgeschlossen wird der Content-Block mit einer Chunk-Size 0 gefolgt von einem leeren Chunk (Leerzeile). Das heißt, ich muss den Content-Block auf Größen im Hexacode durchsuchen, die von einem \r\n abgeschlossen werden. Dieses Transfere-Encoding dient dazu Daten zu übermitteln, deren Größe am Anfang des Response noch nicht bekannt sind. Dies ist zum Beispiel der Fall, wenn man eine Tabelle aus Daten, die in einer Datenbank liegen, generiert. Soweit richtig? Was ich allerdings nicht weiß, ist wie ein Suchmuster, dass diese Größenangaben entfernen könnte, aussehen könnte. Daher verstehe ich auch wahrscheinlich deinen Code-Schnipsel nicht. Irgendwo habe ich auch gelesen, dass diese Chunks immer nur eine Zeile lang sind. Wenn dass Stimmt müsste ich ja einfach nur jede zweite Zeile löschen. Am Ende dann die letzten beiden Zeilen.Das scheint mir aber viel zu einfach oder ist das so richtig?
MfG, Andy
 
Ein Suchmuster dafür gibt es nicht. Das ist auch nicht notwendig, da sich die Chunked-Kodierung sequentiell dekodieren lässt. Das RFC hält dazu auch bereits einen Algorithmus bereit.
 
Diese Klasse dient als Unterklasse für eine andere Klasse, die Repositories von einem anderen Server händeln soll. Da die Verbindung zu einem anderen Server via fopen() fast immer unterbunden ist, soll diese Arbeit von der HTTP-Klasse übernommen werden, die als Unterklasse zu Repository dienen soll.

@Gumbo:
Danke für den Hinweis. Hatte den Allgemeinen Algorithmus wohl übersehen.
MfG, Andy
 
Achso... Also nen Workaround zu fopen() um die Funktion nicht zu nutzen /zu umgehen und ne Verbindung auf nen anderen Server herzustellen...

Gut, gut, dann hab ich das wenigstens geschnallt ^^

tausend Dank für die Info ;)
 
Übung macht den Meister, heißt eine Volksweisheit. Und selbst wenn der Nutzen am Ende gering ist, hat man doch etwas gelernt. Spezifikationen präzise umsetzen muss jeder Programmierer können.
 
Hallo!
Denke auch, dass es sehr hilft solche Dinge einfach mal zu programmieren, da man dabei wirklich sehr viel lernt. Wie dem auch sei, ich habe mir mal diesen Algorithmus angeschaut. Jetzt ist mir auch klar, wie ich diesen übersehen konnte, denn er steht erst nach dem Autorenverzeichnis. Auf jeden Fall habe ich mal angefangen eine Methode zu schreiben, die, im Falle einer chunked Codierung, den Body dekodiert. Leider sind dabei einige Probleme aufgetreten, da ich mich mit RegExp, wie gesagt, leider noch nicht so auseinander gesetzt habe. Ich habe die Methode mal soweit in PHP "umgewandelt" und die RegExp, so wie ich sie schreiben würde, dahinter gesetzt. Vielleicht kann mir ja noch jemand bei dieser Methode helfen.
PHP:
	/**
	* decodeChunked() - Decodes Content in chunked encoding
	*
	* @access: private
	* @param Arr $chunked
	* @return Array
	*/
	private function decodeChunked( $chunked )
	{	    
		$length = 0;
		$body = '';		
		
		read chunk-size | chunk-extension (if any) and CRLF // /([a-fA-F0-9_]+)(|(.+))?\x0D\x0A/
		while (chunk-size > 0) 
		{
			$chunk = read chunk-data and CRLF; // /(.+)\x0D\x0A/
			$body .= $chunk;
			$length = $length + $chunkSize;
			read chunk-size and CRLF // /([a-fA-F0-9_]+)\x0D\x0A/
		}
		
		// set right Content-Length
		$chunked['HEADER_FIELDS']['Content-Length'] = $length;
		
		// change Transfere-Encoding
		$chunked['HEADER_FIELDS']['Transfer-Encoding'] = 'token';
		
		return $chunked;		
	}
Mit den RegExp sollen via preg_match() die gesuchten Daten gefiltert und dann zur Weiterverarbeitung in eine Variabel gespeichert werden. Bei der Korrektheit dieser RegExp bin ich mir leider überhaupt nicht sicher.

Den Teil des Algorithmus, an dem die folgenden Header gelesen werden sollen (wenn ich das jetzt richtig verstanden habe), habe ich weggelassen, da dies ja schon die Methode von Gumbo erledigt. Nur zur Erinnerung das ist folgender Teil
Code:
       read entity-header
       while (entity-header not empty) {
          append entity-header to existing header fields
          read entity-header
       }
Vielleicht könnte mir ja nochmal jemand helfen. Denke aber, dass das soweit richtig ist.
MfG, Andy

//EDIT: Was mir gerade noch einfällt. Wenn ich mich richtig erinnere wird die Chunk-size in Hexadezimal angegeben. Suche deshabl ja auch nur Buchstaben von a-f und zahlen von 0 bis 9. Daher müsste ich das dann aber noch ins Dezimalsystem umrechnen. Wenn ja müsste das dann doch mit hexdec() gehen oder?
 
Zuletzt bearbeitet von einem Moderator:
Ich sag’s gerne noch einmal: die Chunked-Kodierung lässt sich sequenziell dekodieren, du brauchst keine regulären Ausdrücke dafür. Die können in diesem Fall sogar zu Problemen führen.
 

Neue Beiträge

Zurück