Daten komprimiert senden
Maik Görgens
- perl
Hallo!
Ich bin immernoch bestrebt, Daten von meinem CGI-Skript komprimiert an den Browser zu senden. Allerdings klappt das nicht so recht. Ich habe nun mal ein kleines Testskript geschrieben, das ich hier posten will:
#!c:\perl\bin\perl.exe
use Compress::Zlib;
$data = '<html><head><title>Testseite</title></head><body>Kleiner Test</body></html>';
if(%ENV->{'HTTP_ACCEPT_ENCODING'} =~ /gzip/)
{
$data = compress($data);
print "Vary: Accept-Encoding\n";
print "Content-Encoding: gzip\n";
}
print "Content-Type: text/html\n\n".$data;
Kann mir jemand sagen, wie ich den Quelltext verändern muß, damit der Browser das versteht, das er es entschlüsseln soll? Im Moment zeigt er mir nur ein Zeichen-Wirr-Warr an. Ebend nur komprimierte Daten...
Vielen Dank und Grüße
Maik
Hi,
Kann mir jemand sagen, wie ich den Quelltext verändern muß, damit der Browser das versteht, das er es entschlüsseln soll? Im Moment zeigt er mir nur ein Zeichen-Wirr-Warr an. Ebend nur komprimierte Daten...
Ja, ich denke, das kann ich.
1. benutzt du das hier: %ENV->{'HTTP_ACCEPT_ENCODING'}. Das ist falsch, da du einen skalaren Rückgabewert haben willst, keinen Hash. Das hättest du auch gemerkt, wenn du warnings (-w) eingeschaltet hättest.
2. Halte ich es nicht für sinnvoll, die komprimierung im Script selber zu machen. Ich würde da lieber auf mod_gzip beim apache 1 und mod_deflate beim Apache 2 setzten. Wenn dann nämlich dein Server die Daten auch noch einmal versucht zu komprimieren, dürfte beim Browser etwas sonderbares heruskommen.
3. Ist zwar nicht schlimm, aber ich halte das für verschwendete Rchenleistung: "Content-Type: text/html\n\n".$data;. Warum verkettest du diese Strings? Ich würde sie lieber mit komma trennen, das macht zwar sicherlich nicht viel aus, aber bei oft ausgeführten Operationen sicher etwas.
Grüße Andres Freund
Moin Moin !
#!c:\perl\bin\perl.exe
-w fehlt.
-T fehlt.
use strict fehlt.
use Compress::Zlib;
$data = '<html><head><title>Testseite</title></head><body>Kleiner Test</body></html>';
my bzw. our fehlt.
if(%ENV->{'HTTP_ACCEPT_ENCODING'} =~ /gzip/)
%ENV ist ein Hash, keine Hash-Referenz. Siehe Andres' Posting.
{
$data = compress($data);print "Vary: Accept-Encoding\n";
print "Content-Encoding: gzip\n";
Header werden mit CR-LF abgeschlossen.
}
print "Content-Type: text/html\n\n".$data;
Header werden mit CR-LF abgeschlossen.
Du suchst Transfer-Encoding, mod_gzip, gzip_cnc, und mod_deflate.
Alexander
hallo Alexander,
-T fehlt.
Eigenartigerweise funktioniert dieser Schalter bei mir unter Windows nicht (Perl 5.8). Die Fehlermeldung sieht so aus:
Premature end of script headers: comprim.pl
Too late for "-T" option at I:\cgi-bin\comprim.pl line 1.
Grüße aus Berlin
Christoph S.
Moin Moin !
-T fehlt.
Eigenartigerweise funktioniert dieser Schalter bei mir unter Windows nicht (Perl 5.8). Die Fehlermeldung sieht so aus:
Premature end of script headers: comprim.pl
Too late for "-T" option at I:\cgi-bin\comprim.pl line 1.
Ja, weil Perl da schon läuft, und sich dann die Parameter "für Perl" aus der #!-Zeile liest; während unter Unixen der Kernel die #!-Zeile liest und daraus einen Perl-Aufruf bastelt.
Unter Windows geht's wohl wirklich nur mit Workarounds:
Apache: ScriptInterpreterSource Registry ausschalten, dann simuliert der Apache einen Unix-Kernel, was das Interpretieren der #!-Zeile angeht.
Allgemein:
* Scripte *.tpl nennen und *.tpl mit "c:\perl\bin\perl.exe -T %1" verknüpfen.
* Perl-Script in BAT/CMD-Datei verpacken:
@rem = ' (Fokens Eigenbau, geht so nur sauber als CMD unter NT/2K)
@echo off
C:\perl\bin\perl.exe -T -w %0
goto ende
@rem ';
use strict;
print "Hallo Welt!";
__END__
:ende
Oder mit C:\perl\bin\perl2bat.bat eine analoge "Verpackung" bauen und den -T-Switch einbauen.
Alexander
Moin!
if(%ENV->{'HTTP_ACCEPT_ENCODING'} =~ /gzip/)
%ENV ist ein Hash, keine Hash-Referenz. Siehe Andres' Posting.
Und selbst wenn es eine Referenz waere, waere die Syntax kaputt.
Du suchst Transfer-Encoding, mod_gzip, gzip_cnc, und mod_deflate.
Transfer-Encoding? Gibt es einen Browser, der das versteht? Ich habe vor einiger Zeit mal mit einem Mozilla-Entwickler gesprochen, der meinte, alle Browser incl. Mozilla verstehen nur Content-Encoding, und das verstehen sie auch noch falsch, sie interpretieren naemlich das hinein, was eigentlich mit Transfer-Encoding gemeint ist.
So long
Moin Moin !
if(%ENV->{'HTTP_ACCEPT_ENCODING'} =~ /gzip/)
%ENV ist ein Hash, keine Hash-Referenz. Siehe Andres' Posting.
Und selbst wenn es eine Referenz waere, waere die Syntax kaputt.
Richtig.
Du suchst Transfer-Encoding, mod_gzip, gzip_cnc, und mod_deflate.
Transfer-Encoding? Gibt es einen Browser, der das versteht? Ich habe vor einiger Zeit mal mit einem Mozilla-Entwickler gesprochen, der meinte, alle Browser incl. Mozilla verstehen nur Content-Encoding, und das verstehen sie auch noch falsch, sie interpretieren naemlich das hinein, was eigentlich mit Transfer-Encoding gemeint ist.
Stimmt.
Und selbst Content-Encoding mag nicht jeder:http://www.schroepl.net/projekte/mod_gzip/browser.htm
Alexander