perl-modperl mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Matt Williamson" <m...@sanasecurity.com>
Subject [mp2] aborting a file upload
Date Fri, 02 Mar 2007 23:37:10 GMT
I am trying to write a mod_perl handler to take POST requests which have
some parameters encoded in the url string, and a body that needs to be
saved to a file. It is not like a conventional file upload from a form.

I want to implement a limit on the size of the body that can be
uploaded. However, I do not want to return a failure to the client in
that case, rather I want to process the header information (saving it to
a database), but just not save the file. The problem I am having is that
I cannot figure out how to throw away the data if it is above a certain
size limit, without loading all the data.

I have a module registered as a PerlResponseHander, with code somewhat
like 

my $contentLimit = 104857600;

sub handler {
    my $r = shift;
    my $req = Apache2::Request->new($r);
    my $contentLength = $r->headers_in->{'Content-Length'};

    # figure out if we have been sent too much stuff
    if ($contentLength > $contentLimit) {
       &r->log_error($r, "not saving because: " . $req->body_status());
    } else {
       &saveZipData($r, $outFile);
    }

  # write data from headers to database
  &persistHeaderInfo(...);

  # return ok
  return Apache2::Const::OK;
}

sub saveZipData {
    my ($r, $outFile) = @_;
    my $buffer;
    my $data;
    open OUT, ">$outFile" or die "Could not open $outFile for output:
$!";
    binmode OUT;
    while ($r->read($buffer, 4092)) {
        $data .= $buffer;
        print OUT $buffer;
    }
    close OUT;
}

I find that the very large file gets completely loaded, just not saved
to disk. What I want to happen in the case of a large upload is for the
file not to be uploaded, and just the headers processed and the database
updated. E.g. so that that response time for the client with a very
large upload is short.

I have tried POST_MAX on the Apache2::Request creation, but that just
appears to write an error message. 

I have tried reading the documentation on filters. Do I need to make an
input filter to throw away the data if it is larger than a certain size?
If so, how? Should I be saving the data to file in a filter or is it ok
to do it in a PerlResponseHandler?

There are also calls on the RequestRec object like
discard_request_body(), but these don't seem to alter the behavior that
I see.

Any help would be much appreciated

Cheers

Matt


Mime
View raw message