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;
} 

Reply via email to