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 )