I wrote a filter which I think does the trick. It seems to work. In the
filter I send end of stream (eos) if the content length is too large,
otherwise just pass the data along. The filter is registered as a
PerlInputFilterHandler, which according to the docs only gets called on
the body, not the headers.
Since I am new to mod_perl, could anyone comment on whether this is a
dangerous thing to do?
Code below
Matt
use base qw(Apache2::Filter);
use Apache2::Const -compile => qw(OK :log);
use APR::Const -compile => qw(SUCCESS);
use Apache2::RequestRec ();
use Apache2::Log ();
use constant BUFF_LEN => 4092;
use constant CONTENT_LIMIT => 104857600;
sub handler : FilterRequestHandler {
my $f = shift;
# get the request.
my $r = $f->r;
my $contentLength = $r->headers_in->{'Content-Length'};
if ($contentLength > CONTENT_LIMIT) {
# send an end of stream
$f->seen_eos(1);
} else {
while ($f->read(my $buffer, BUFF_LEN)) {
$f->print($buffer);
}
}
Apache2::Const::OK;
}