Henryk Plötz: Perl-Modul mit der Funktion von mod_gzip

Beitrag lesen

Moin

Wenn Du Deine Ausgabe aber mit anderen Dingen kombinieren willst, könnte es Probleme geben. Beispielsweise wäre es wohl schon ein Unterschied, ob das Skript standalone oder via SSI gestartet wird - SSI verwendet chunking ... und ob die Browser damit dann noch klar kommen, weiß der Himmel.

Ich sehe bei Chunked keine Probleme. Folgendes kleines Test-Skript habe ich verwendet:
#!/usr/bin/perl

print "Content-Type: text/html\n";
print "Content-Encoding: gzip\n\n";

open(HH,"</tmp/192.html.gz");

while(<HH>) {
 print $_;
}

Wobei die Datei die da ausgegeben wird, eine ganz normal auf der Kommandozeile mit gzip komprimierte Datei ist.
Nachfolgend die zwischen Server und Browser ausgetauschten Header:

In Galeon 1.0.3 (verwendet Mozilla 0.9.8):
GET /cgi-bin/192_test.pl HTTP/1.1
Host: fuzzy.homeip.net
User-Agent: Mozilla/5.0 Galeon/1.0.3 (X11; Linux i686; U;) Gecko/20020206
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1
Accept-Language: de, en;q=0.50
Accept-Encoding: gzip, deflate, compress;q=0.9
Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

HTTP/1.1 200 OK
Date: Sun, 24 Feb 2002 18:43:59 GMT
Server: Apache/1.3.19 (Unix)  (SuSE/Linux) mod_throttle/3.0 PHP/4.0.4pl1 mod_layout/1.0 mod_dtcl mod_fastcgi/2.2.2 mod_perl/1.25 mod_python/2.7.2 Python/2.0 mod_ssl/2.8.3 OpenSSL/0.9.6a
Content-Encoding: gzip
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html

Danach kommen dann die gezippten Daten mit Chunked-Encoding. Da die Daten scheinbar alle in einen Buffer passen, kommt nur ein Chunk und danach der Abschluss-Chunk mit der Länge 0. Fällt dir vielleicht ein Weg ein, wie man bei diesem Fall das doch recht sinnfreie Chunking abschalten kann?

In Netscape 4:
GET /cgi-bin/192_test.pl HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.77 [de] (X11; U; Linux 2.4.4-4GB i686)
Pragma: no-cache
Host: fuzzy.homeip.net
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*
Accept-Encoding: gzip
Accept-Language: de, en
Accept-Charset: iso-8859-1,*,utf-8

HTTP/1.1 200 OK
Date: Sun, 24 Feb 2002 18:49:39 GMT
Server: Apache/1.3.19 (Unix)  (SuSE/Linux) mod_throttle/3.0 PHP/4.0.4pl1 mod_layout/1.0 mod_dtcl mod_fastcgi/2.2.2 mod_perl/1.25 mod_python/2.7.2 Python/2.0 mod_ssl/2.8.3 OpenSSL/0.9.6a
Content-Encoding: gzip
Connection: close
Content-Type: text/html

Danach kommen die gezippten Daten, ungechunkt (weil Chunked bei HTTP 1.0-Clients nicht zwangsweise unterstützt werden muss). Das ganze funktioniert auch mit Lynx und das Verhalten ist dann identisch zu dem von NN4 (naja, bis auf die Tatsache, dass Lynx zwei Tonnen voll Accept:-Header sendet).

Mehr Browser hab ich grade hier nicht zur Verfügung.

Erik: Denk dran dass du wenn du Content-Encoding: gzip verwendest dich auch an die gzip-Struktur hältst. Das schliesst den 10Byte-Vorspann mit ein!

PS: Habe das grade nochmal mit Daten probiert die nicht alle in einen Chunk passen. -> Kein Problem

PPS: Mir fällt grade auf dass das genau bei jedem zweiten Ladeversuch schiefgeht und zu einem 500 mit "Premature end of script headers" führt. Kann das jemand erklären?

--
Henryk Plötz
Grüße aus Berlin