CGI-Compress-Gzip
view release on metacpan or search on metacpan
if there is one open.
CAVEATS
Apache::Registry
Under Apache::Registry, global variables may not go out of scope in
time. This may causes timing bugs, since this module makes use of the
DESTROY() method. To avoid this issue, make sure your CGI object is
stored in a scoped variable.
# BROKEN CODE
use CGI::Compress::Gzip;
$q = CGI::Compress::Gzip->new;
print $q->header;
print "Hello, world\n";
# WORKAROUND CODE
use CGI::Compress::Gzip;
do {
my $q = CGI::Compress::Gzip->new;
print $q->header;
print "Hello, world\n";
}
Filehandles
This module works by changing the default filehandle. It does not change
STDOUT at all. As a consequence, your programs should call `print'
without a filehandle argument.
# BROKEN CODE
use CGI::Compress::Gzip;
my $q = CGI::Compress::Gzip->new;
print STDOUT $q->header;
print STDOUT "Hello, world\n";
# WORKAROUND CODE
use CGI::Compress::Gzip;
my $q = CGI::Compress::Gzip->new;
print $q->header;
print "Hello, world\n";
Future versions may steal away STDOUT and replace it with the
compression filehandle, but that seemed too risky for this version.
Header Munging
When sending compressed output, the HTTP headers must remain
uncompressed. So, this module goes to great effort to keep the headers
and body separate. That has led to CGI::header() emulation code that is
a little brittle. Most potential problems arise because STDOUT gets
tweaked as soon as header() is called.
If you use the CGI.pm header() API as specified in CGI.pm, then all
should go well. But if you do anything unusual, this module may break.
For example:
# BROKEN CODE
use CGI::Compress::Gzip;
my $q = CGI::Compress::Gzip->new;
print "Set-Cookie: foo=bar\n" . $q->header;
print "Hello, world\n";
# WORKAROUND 1 (preferred)
use CGI::Compress::Gzip;
my $q = CGI::Compress::Gzip->new;
print $q->header("-Set_Cookie" => "foo=bar");
print "Hello, world\n";
# WORKAROUND 2
use CGI::Compress::Gzip;
my $q = CGI::Compress::Gzip->new;
print "Set-Cookie: foo=bar\n";
print $q->header;
print "Hello, world\n";
Future versions could try to parse the header to look for its end rather
than insisting that the printed version match the version returned by
header(). Patches would be very welcome.
SEE ALSO
CGI::Compress::Gzip depends on CGI and IO::Zlib. Similar functionality
is available from mod_gzip, Apache::Compress or Apache::GzipChain,
however all of those require changes to the webserver configuration.
AUTHOR
Chris Dolan
This module was originally developed by me at Clotho Advanced Media Inc.
Now I maintain it in my spare time.
ACKNOWLEDGMENTS
Clotho greatly appreciates the assistance and feedback the community has
extended to help refine this module.
Thanks to Rhesa Rozendaal who noticed the -Type omission in v0.17.
Thanks to Laga Mahesa who did some Windows testing and experimentation.
Thanks to Slaven Rezic who 1) found several header handling bugs, 2)
discovered the Apache::Registry and Filehandle caveats, 3) provided a
patch incorporated into v0.17, and 4) persisted with smoke tests that
reproduced the envvar problem fixed in v0.23.
Thanks to Jan Willamowius who found a header handling bug.
Thanks to Andreas J. Koenig and brian d foy for module naming advice.
HELP WANTED
If you like this module, please help by testing on Windows or in a
`FastCGI' environment, since I have neither available for easy testing.
Personally, I don't use this module much anymore as all of my work is on
Catalyst and mod_perl now.
( run in 0.542 second using v1.01-cache-2.11-cpan-39bf76dae61 )