And then I find the answer in the FAQ: In Mojolicious <http://www.mojolicious.org/perldoc/Mojolicious> applications you can also use the helper "inactivity_timeout" in Mojolicious::Plugin::DefaultHelpers <http://www.mojolicious.org/perldoc/Mojolicious/Plugin/DefaultHelpers#inactivity_timeout> to change it on demand for each connection individually. This timeout always applies, so you might have to tweak it for applications that take a long time to process a request.
Not sure how I missed that. As you were. Scott On Tuesday, September 5, 2017 at 2:21:31 PM UTC-6, Scott Wiersdorf wrote: > > I have a slow HTTP service I'm writing a proxy for. If I hit the service > directly using curl, it looks like this: > > $ time curl http://localhost:3333/?timer=10 > {"message":"waited 10 seconds"} > real 0m10.018s > user 0m0.005s > sys 0m0.005s > > > I can hit it at 14s: > > $ time curl http://localhost:3333/?timer=14 > {"message":"waited 14 seconds"} > real 0m14.019s > user 0m0.005s > sys 0m0.005s > > > And at 16s: > > $ time curl http://localhost:3333/?timer=16 > {"message":"waited 16 seconds"} > real 0m16.018s > user 0m0.005s > sys 0m0.005s > > > I wrote a Mojolicious proxy for the slow service: > > use Mojolicious::Lite; > > get '/slow' => sub { > my $c = shift; > my $timer = $c->param('timer') // 10; > $c->render_later; > > my $url = Mojo::URL->new('http://localhost:3333'); > $url->query(timer => $timer); > > app->log->debug("Invoking " . $url->to_string); > > $c->ua->inactivity_timeout(60)->connect_timeout(60)->request_timeout(60)->get($url, > > sub { > my $tx = pop; > $c->render(json => $tx->res->json); > }); > }; > > app->start; > > > You can see my various *_timeout() invocations on the user agent. If I hit > the proxy, I get what I expect at 14s: > > $ curl --include http://localhost:3000/slow?timer=14 > HTTP/1.1 200 OK > Content-Length: 31 > Server: Mojolicious (Perl) > Date: Tue, 05 Sep 2017 20:00:04 GMT > Content-Type: application/json;charset=UTF-8 > > {"message":"waited 14 seconds"} > > > But at 16s I get a timeout error: > > $ curl --include http://localhost:3000/slow?timer=16 > curl: (52) Empty reply from server > > > Indeed, the proxy's log shows the request and then a timeout 15s after the > request: > > [Tue Sep 5 14:00:45 2017] [debug] Invoking http://localhost:3333?timer=16 > [Tue Sep 5 14:01:00 2017] [debug] Inactivity timeout > Mojo::Reactor::Poll: I/O watcher failed: Connection already closed at > utils/slow-wrap line 15. > > > There's something magic about 15s. I added the various timeouts on the > user agent, so something else is timing out. I suspect it may be the > default timeout in the Mojo::IOLoop::Stream constructor: > > sub new { shift->SUPER::new(handle => shift, buffer => '', timeout => 15) } > > > If I start my proxy with MOJO_INACTIVITY_TIMOUT=60, then the proxy does > *not* timeout: > > $ curl --include http://localhost:3000/slow?timer=16 > HTTP/1.1 200 OK > Content-Length: 31 > Server: Mojolicious (Perl) > Content-Type: application/json;charset=UTF-8 > Date: Tue, 05 Sep 2017 20:04:50 GMT > > {"message":"waited 16 seconds"} > > > And the proxy logs are clean: > > $ MOJO_INACTIVITY_TIMEOUT=60 ct utils/slow-wrap daemon > [Tue Sep 5 14:04:28 2017] [info] Listening at "http://*:3000" > Server available at http://127.0.0.1:3000 > [Tue Sep 5 14:04:34 2017] [debug] GET "/slow" > [Tue Sep 5 14:04:34 2017] [debug] Routing to a callback > [Tue Sep 5 14:04:34 2017] [debug] Invoking http://localhost:3333?timer=16 > [Tue Sep 5 14:04:50 2017] [debug] 200 OK (16.012817s, 0.062/s) > > > My question is: how can I determine what timeout is being triggered at > 15s, and how can I change it on a per-request basis? I don't want to set > that timeout for the entire proxy (I do want other slow calls to > timeout)—just this particular controller. Is that possible? I've seen > various email threads that recommend adding something like to the > controller (before invoking the user-agent): > > Mojo::IOLoop->stream($c->tx->connection)->timeout(60); > > > which seems to work in this situation, but I'm unsure this is the right > approach. Is there a better mechanism for this? Will this hold up for many > requests in the event loop at once? > > Scott > -- You received this message because you are subscribed to the Google Groups "Mojolicious" group. To unsubscribe from this group and stop receiving emails from it, send an email to mojolicious+unsubscr...@googlegroups.com. To post to this group, send email to mojolicious@googlegroups.com. Visit this group at https://groups.google.com/group/mojolicious. For more options, visit https://groups.google.com/d/optout.