Sönke Tesch: gzip decodieren

Beitrag lesen

Funktioniert nicht. Also ich habe mit fsockopen, fputs und dann fgets folgendes zurückbekommen:

HTTP/1.1 200 OK
Content-Encoding: gzip
Transfer-Encoding: chunked

danach kam Durcheinander, was mir wie komprimiert aussieht. Wie genau muss ich nun vorgehen, um das zu dekomprimieren?

Die Kodierung gzip verwendet das Format des gleichnamigen, in der Unix-Welt weit verbreiteten Dateipackers gzip. Dessen Funktionalität findet sich in der zlib/PHP-Funktion gzencode() wieder, zu der es aber merkwürdigerweise kein direktes Gegenstück zu geben scheint.
Das gzip-Dateiformat entspricht nun aber IIRC dem, was Du mit gzinflate() erreichst plus einiger Zusatzdaten wie Prüfsumme, Dateiname und -größe. Anders ausgedrückt entspricht gzencode() also gzinflate() mit ein paar Schokostreuseln obendrauf.

Das exakte gzip-Dateiformat findest Du unter http://www.ietf.org/rfc/rfc1952.txt wieder (so steht's übrigens auch in der Anleitungsseite zu gzencode()); mit den String-Funktionen sollten sich Deine Rohdaten passend zurecht stutzen lassen.
Falls es ab und an zu Dekodierungsfehlern kommt, nicht wundern: PHP hat (oder hatte?) hier und da Probleme mit Binärzeichenketten.

Beachte bitte auch, daß der Webserver Dir seine Daten -unabhängig von der gzip-Kodierung- häppchenweise schickt ("chunked"). Statt sofort der Daten bekommst Du erst die Länge in Bytes als Zeichenkette, einen Zeilenvorschub und dann ein entsprechend langes Datenstück. Abgeschlossen wird die Übertragung durch ein Null Bytes langes Stück oder Abbruch der Verbindung.
Ich bin mir nicht sicher, ob das so richtig ist, schaue bitte in der RFC 2616 (<[link:http://www.ietf.org/rfc/rfc2616.txt>]) nach, der Spezifikation von HTTP 1.1.

Gruß,
  soenk.e