You are viewing a plain text version of this content. The canonical link for it is here.
Posted to apreq-dev@httpd.apache.org by Gavin <ha...@gmail.com> on 2010/02/23 01:25:50 UTC

hard_timeout in $apr->parse

Problem:
We work with mobile phone networks, and sometimes the providers networks can
be very slow. A user does a post (simple, or file upload) which hits out
timeout length and fails. When this happens, because APR does a
hard_timeout, it jumps(longjmp) back to apache and not clearing the perl
callstack. (http://www.mail-archive.com/modperl@apache.org/msg10999.html for
reference from the mod_perl lists from back in august 2000)

This isn't entirely an issue, except perl eventually detects this as
infinite recursion in much later requests and dies.

I'm providing a test case and a possible solution, but I'm not really
familiar with the internals of apreq, so I don't know if there is a better
way to handle this, or implement it, but so far from our initial tests it
all works properly.

Sample Script: (http://www.halkeye.net/files/apreq/testBadRequest.txt)
Essentially our apache servers have a "Timeout 30" set, and the networks are
taking more than 30 seconds to come in.

This script is setup to take a 5 second pause (we updated the timeout for
testing) before finishing the request.

When running this script on a very basic handler:
213  sub handler {
214     my $r = Apache::Request->new(shift);
215     print STDERR Carp::longmess("before parse")
216     my $status = $r->parse;
217
218     if ($status)
219     {
220         my $errmsg = $r->notes("error-notes");
221         print STDERR "Error parsing request: $errmsg && $status\n";
222         die("Error parsing request: $errmsg");
223     }

Leads to:
        eval {...} called at /home/main/Platform.pm line 216
        WAP::Platform::handler('Apache=SCALAR(0x11b485a0)') called at
/home/main/Platform.pm line 216
        eval {...} called at /home/main/Platform.pm line 216
        WAP::Platform::handler('Apache=SCALAR(0x11b48330)') called at
/home/main/Platform.pm line 216
        eval {...} called at /home/main/Platform.pm line 216
        WAP::Platform::handler('Apache=SCALAR(0x11b4821c)') called at
/home/main/Platform.pm line 216

and so on.

My Solution:
1) Search and replace any hard_timeout with soft_timeout
2) Recompile and install
3) Update code to check $r->connection->aborted, ie:
    my $status = $r->parse;
    unless ($status == OK) {
        $r->custom_response($status, $r->notes("error-notes"));
        die $r->notes("error-notes");
        return $status;
    }

    if ($r->connection->aborted)
    {
        $r->status(408); # Timeout error message
        return Apache::Constants::OK;
    }

unsubscribe

Posted by Erik Westland <er...@yahoo.com>.