Re: Suggestion on perl handler to reject request with large content length

Mohit Anchlia <[email protected]>
Newsgroups gmane.comp.apache.mod-perl
Message-ID <[email protected]>
On Fri, Nov 19, 2010 at 9:59 AM, Mohit Anchlia <[email protected]> wrote:
> On Thu, Nov 18, 2010 at 6:26 PM, Mark J. Reed <[email protected]> wrote:
>> On Thu, Nov 18, 2010 at 8:47 PM, Mohit Anchlia <[email protected]> wrote:
>>> I have a requirement to look at content length and if it is greatar
>>> than desired size then return error message. So psuedo code is like:
>>
>> Easier solution: use LImitRequestBody, but have a perl handler that
>> sets a custom response text for  413's as appropriate.
> Problem is that LimitRequestBody is not returning 413. Not sure why.
> If at all I get LimitRequesTBody to work then how will I bind this
> handler to the status code?
>>
>> something like:
>>
>> sub handler {
>>    my $r = shift;
>>    if ($r->uri =~ /abc/) {
>>
>>    $r->custom_response
>>
>> What if the request has no Content-Length: header at all?  Do you let
>> it through then, no matter how big the body is?
>>
>>
>>> if content_length > 32G
>>> then
>>>  if url contains /abc/
>>>  then
>>>      echo "0|abc|Bad length" # pipe delimited format that some
>>> clients api support
>>>  else if url contains /def/
>>>      echo "<xml><message>Bad request</message><xml>" # client supporting XML
>>>  fi
>>> fi
>>
>> Yuck.  I would move the logic into whatever handles the API calls
>> rather than duplicating the mapping from URI's to code in two places.
>> That's just asking for things to get out of synch.
>
> I agree, but only problem is that the handler is in Jboss App. which
> means streams will have to pass from web server to our app server. I
> was trying to see if we can block right at the web server.
>>
>>> I first thought of using LimitRequestBody but that didn't work for me.
>>> So now I am thinking if using perl handlers.
>>>
>>> P.S. Note: Our requests are mod-jk requests. So if content length
>>> check succeeds then hand over the request to mod jk workers wihch then
>>> send it to jboss app server.
>>>
>>> I tried to write code but still unsure of few thing:
>>>
>>> 1. If I return  HTTP_REQUEST_ENTITY_TOO_LARGE response then would it
>>> still continue sending the request to mod_jk. Or would it be returned
>>> back to the client? When does apache decide if request need to be
>>> stopped and send back to the client.
>>> 2. Does my code look ok and something that will work? Can someone
>>> please suggest?
>>>
>>>
>>> This is my sample code
>>>
>>> sub content_handler {
>>>  my $r = shift;
>>>  my $uri = $r->uri;
>>>  if ( $r->header_in("Content-length") lt 20000000) {
>>>      return Apache2::Const::OK; # Continue sending request to mod jk worker
>>>  }
>>>  $r->send_http_header;
>>>  if ($uri =~ /xml/){
>>>     $r->content_type("text/xml");
>>>     $r->print("File too large|Bye"); #Send pipe delimited back to the
>>> client assuming it will not continue sending this request to mod_jk
>>> worker
>>>  }else{
>>>     $r->content_type("text/plain");
>>>     $r->print ("<xml><Message>Too Large, Bye!!</Message></xml>");
>>> #Send xml delimited back to the client assuming it will not continue
>>> sending this request to mod_jk worker
>>>  }
>>>
>>>  return Apache2::Const::HTTP_REQUEST_ENTITY_TOO_LARGE; # Return back to client

I still need some suggestion on this question:

If I return  HTTP_REQUEST_ENTITY_TOO_LARGE response then would PerlHandler
still continue sending the request to mod_jk. Or would it be returned
back to the client? When does apache decide if request need to be
stopped and send back to the client.

>>>
>>
>>
>>
>> --
>> Mark J. Reed <[email protected]>
>>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.