package Apache2Kludge;
use 5.006;
use strict;
use warnings;
use Apache::Filter (); # $f
use Apache::RequestRec (); # $r
use Apache::RequestUtil (); # $r->dir_config()
use APR::Table (); # dir_config->get() and headers_out->get()
use Apache::Const -compile => qw(OK DECLINED);
our $VERSION = '0.03';
sub handler {
my $f = shift;
my $r = $f->r;
unless ($f->ctx) {
# Only does this when the filter is first called.
$r->headers_out->unset('Content-Length');
}
# retrieve the filter context, which was set up on the first invocation
my $context = $f->ctx;
while ($f->read(my $buffer, 1024)) {
$f->print($buffer);
}
$f->ctx($context);
return Apache::OK;
}
1;
__END__
=head1 NAME
Apache2Kludge - mod_perl OutputFilterHandler for removing the Content-Length for CGI scripts
=head1 SYNOPSIS
#In Apache 2.0 config
PerlModule Apache2Kludge
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
PerlOutputFilterHandler Apache2Kludge
PerlOptions +ParseHeaders
Options +ExecCGI
This module implements an Apache 2.0 output filter that removes the Content-Length for scripts that
worked under Apache 1.3 mod_cgi, but won't run under Apache 2.0
=head1 DESCRIPTION
This module implements an Apache 2.0 output filter that removes the Content-Length for scripts that
worked under Apache 1.3 mod_cgi, but won't run under Apache 2.0
When I encountered this problem, no one had a fix, and looking around I found many other people having this same problem.
The problem seems to come from Apache sending the Content-Length prematurely.
The error generated in the logs when the script fails is
(70007)The timeout specified has expired: ap_content_length_filter: apr_bucket_read() failed
This can also be indicitive of other problems.
The Apache side of the configuration happens like so
#In Apache 2.0 config
PerlModule Apache2Kludge
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
PerlOutputFilterHandler Apache2Kludge
PerlOptions +ParseHeaders
Options +ExecCGI
=head2 EXPORT
None by default.
=head1 AUTHOR
Lee Pumphret, Eperl+REMOVETHIS+@+ANDTHAT+leeland.netE
=head1 COPYRIGHT
This module is free software. It may be used, redistributed
and/or modified under the same terms as Perl itself.
=head1
L.
=cut