Henryk Plötz: Probleme mit POST Header (multipart/form-data)

Beitrag lesen

Moin,

Ohha! Naja, selbiges habe ich wohl unten falsch gemacht. Kannst Du mir mal sagen wie man sowas "umrechnet"? Also CRLF in \0x0D\0x0A ?

CR ist Carriage Return, also Zeichen 13, hexadezimal demnach 0x0D. LF ist Line Feed also Zeichen 10, hexadezimal 0x0A. (Das ist jetzt die Schreibweise für Zahlen. Wenn es in einem String auftauchen soll, schreibt man \x0D bzw \x0A, die Null kann weggelassen werden.)

Warum eigentlich "keep-Alive"? Ich dachte immer HTTP wäre zustandslos, was soll dann sowas überhaupt?

Ist es auch. Da aber sonst für jede HTTP-Anfrage eine neue TCP-Verbindung geöffnet werden muss, was unter Umständen erheblich Zeit kostet (mindestens 3 mal die Zeit von einem zum anderen Ende) lässt man die eine TCP-Verbindung einfach offen und sendet mehrere Anfragen darüber (beim Apache zum Beispiel defaultmäßig bis zu 100). Das hat aber noch überhaupt nichts mit 'HTTP-Verbindungen' zu tun, es ist lediglich eine (entbehrliche) Abkürzung. Wenn Server und Client HTTP richtig können, können sie sogar Pipelining machen, d.h. alle Anfragen hintereineinanderweg in der Verbindung senden, ohne auf die Antworten zu warten, die kommen dann, wenn der Server soweit ist.

da stimmt wohl was nicht ;-) Aber ich habe mich doch an die Vorgaben gehalten, oder?

Ja, zwei Kleinigkeiten sind mir aufgefallen: a) im zuständigen RFC 1867 ist ein Komma statt eines Semikolons beim Content-type: multipart/form-data, boundary=bla (aber das scheint kein Problem zu sein) und b) Wenn du die Boundary später verwendest, müssen jeweils noch zwei Striche davor.

Folgender Ausschnitt funktioniert:

define(CRLF, "\xD\xA");

$data = "--".$boundary.CRLF;
 $data .= "Content-Disposition: form-data; ";
 $data .= "name="$name"; ";
 $data .= "filename="$filename"".CRLF;
 $data .= "Content-Type: text/plain".CRLF.CRLF;
 $data .= $gzstring.CRLF;

$header = "POST $path HTTP/1.0".CRLF;
 $header .= "Host: $host".CRLF;
 $header .= "Content-length: ".strlen($data).CRLF;
 $header .= "Content-type: multipart/form-data, boundary=$boundary".CRLF.CRLF;
 $header .= $data;
 $header .= "--".$boundary."--".CRLF;

--
Henryk Plötz
Grüße von der Ostsee