Andreas Korthaus: Header und Body eines HTTP-Response sicher trennen

Beitrag lesen

Hi!

Ich öffne mit fsockopen() eine HTTP-Verbindung und bekomme eine Antwort mit einem Header und einem Body mit binären Daten(gzip). Trennen  kann ich header und body ja einfach mit:

print_r(explode("\r\n\r\n",$result));

Aber ist das auch sicher? Zum einen, wird das auf jedem Server mit \r\n\r\n umgebrochen?

Ja, das steht so im HTTP-Standard: Der Body eines HTTP-Responses beginnt nach einer Leerzeile.

Du solltest bedenken, dass eine Leerzeile durchaus auch durch "\n\n" realisiert werden kann - ich schreibe in meinen alten Perl-Skripten jedenfalls immer
print "Content-type: text/html\n\n";
um den HTTP-Header auszugeben und danach mit dem Body weiterzumachen. Insofern solltest du dich nicht auf "\r\n" als einziges Zeilentrennzeichen versteifen.

Ja, aber wie? Sind denn "\r\n\r\n" und "\n\n" die einzigen Möglichkeiten? Vor wenn ich nach "\r\n\r\n" suche(z.B. mit strstr()), dann kann es ja sein das ich es finde, aber im body und nach dem header wir mit "\n\n" umgebrochen! Oder was mit

preg_match("^(.*?)(\r\n|\n){2}(.*)//",$html,$matches);
$body = $matches[3];

wäre das sicher?

Außerdem solltest du sicherstellen, dass du nur das _erste_ Auftreten einer Leerzeile als Trennzeichen erkannt wird, denn sonst trennst du, wie du schon selbst erkannt hast, Teile ab, die nicht abgetrennt werden dürfen.

Sollte mit obiger Version sichergestellt sein, soder vielleicht doch mit explode, und alle Elemente des Array außer dem ersten mit implode zu einem String verschmelzen?

Grüße
Andreas