I'm not sure it's possible to abort the read. I think the server must
finish the read before the client will accept any response data. IIRC,
discard_request_body still performs a read on the socket; it just
doesn't do anything with the read data.
Issac
Matt Williamson wrote:
> 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
>