Apache-Precompress
view release on metacpan or search on metacpan
Precompress.pm view on Meta::CPAN
$VERSION = sprintf '%d.%d', q$Revision: 0.1 $ =~ /: (\d+).(\d+)/;
sub handler
{
my $r = shift;
my $buffer;
if (lc($r->dir_config('Filter')) eq 'on')
{
$r = $r->filter_register;
}
if(-d $r->filename())
{
# Redirect to the directory index - bit of a hack atm
$r->uri($r->uri() . '/index.html');
$r->headers_out->set(Location => $r->uri);
return REDIRECT;
}
# Quick file check
unless(-e $r->filename . '.gz')
{
error($r->log,"Cannot open " . $r->filename . ".gz\n");
return NOT_FOUND;
}
if (
$r->dir_config->get('SSI')
||
!defined($r->header_in('Accept-Encoding'))
||
$r->header_in('Accept-Encoding') eq ""
||
$r->header_in('Accept-Encoding') !~ /gzip/
)
{
$r->send_http_header;
my $gz = gzopen($r->filename() . '.gz', "rb")
or return error($r->log,"Cannot open " . $r->filename . ".gz: $gzerrno\n");
while($gz->gzread($buffer,4096) > 0)
{
$r->print($buffer);
}
if($gzerrno != Z_STREAM_END)
{
return error($r->log,"Error reading from " . $r->filename . ".gz: $gzerrno\n");
}
$gz->gzclose();
undef $gz;
}
else
{
$r->content_encoding('gzip');
$r->send_http_header;
open(FILE, $r->filename . '.gz') || return NOT_FOUND;
binmode(FILE);
while( read(FILE, $buffer, 4096) > 0)
{
$r->print($buffer);
}
close(FILE);
}
return OK;
}
sub error
{
my $handle = shift;
my $msg = shift;
$handle->error($msg);
return SERVER_ERROR;
}
1;
__END__
=head1 NAME
Apache::Preompress - Deliver already compressed files or decompress on the fly
=head1 SYNOPSIS
PerlModule Apache::Precompress
# Handle regular files, ie index.html.gz
# Incoming request would be index.html
<Directory "your-docroot/compressdfilesdir">
SetHandler perl-script
PerlHandler Apache::Precompress
</Directory>
# Handle files by given extension .gzhtml
<FilesMatch "\.gzhtml$">
SetHandler perl-script
PerlHandler Apache::Precompress
</FilesMatch>
# You want to use SSI but your templates are compressed
AddHandler server-parsed .html
<FilesMatch "\.shtml$">
Options +Includes
PerlSetVar SSI 1
</FilesMatch>
# You have a compressed web page and a mix of compressed
# and uncompressed templates. You'll need Apache::Filter
# and Apache::SSI
PerlModule Apache::Filter
PerlModule Apache::Precompress
PerlModule Apache::SSI
<FilesMatch "\.html$"> # or whatever
SetHandler perl-script
PerlSetVar Filter On
PerlSetVar SSI 1
( run in 1.277 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )