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>.