Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re^2: Strange blocking issue with HTTP::Daemon

by isync (Hermit)
on Aug 10, 2010 at 23:28 UTC ( #854169=note: print w/ replies, xml ) Need Help??


in reply to Re: Strange blocking issue with HTTP::Daemon
in thread Strange blocking issue with HTTP::Daemon

Can someone explain to me what is happening here? Come on, monks..
Why is a vanilla HTTP::Daemon behaving like that, and what must be done to solve it?

A bit unsatisfactory to switch to Net::Server. Especially as the ::HTTP personality is so far less usable than HTTP::Daemon's...

And: Doesn't the ancient Net::Server::NonBlocking effectively do the same as the ::Fork'ing ::PreForkin'ing etc. personas? As said, I've tried a script around Net::Server::etc. and it showed the same behaviour (if I remember correctly). I might port my test-server.pl to Net::Server::MultiType, but I would prefer understanding why I invest this effort.


Comment on Re^2: Strange blocking issue with HTTP::Daemon
Re^3: Strange blocking issue with HTTP::Daemon
by Anonymous Monk on Sep 26, 2012 at 16:51 UTC

    Replying to an ancient post but this is little to do with HTTP::Daemon. The issue is that once you have accepted a connection you loop processing its requests until it goes away. With the LWP::UserAgent it appears to close the connection after each request but a web browser will attempt to keep the connection open meaning your code will block on the get_request.

    The example code in the HTTP:Daemon synopsis is the problem. The code below is how I use HTTP::Daemon. Instead of blocking in the get_request call I put the daemon and client connections in an IO::Select object and block on that and only process data from those that are ready. That way a single threaded server can appear to be processing data concurrently from multiple connections including regular browsers that will keep the connection open.

    my $d = HTTP::Daemon->new( LocalAddr => 'localhost', LocalPort => 4242, ReuseAddr => 1) || die; my $select = IO::Select->new(); $select->add($d); while ($select->count()) { my @ready = $select->can_read(); # Blocking foreach my $connection (@ready) { if ($connection == $d) { # on the daemon so accept and add the connection my $client = $connection->accept(); $select->add($client); } else { # is a client connection my $request = $connection->get_request(); if ($request) { # process the request } else { # connection closed by the client $select->remove($connection); $connection->close(); # probably not necessary } } # end processing connections with data }

    Now back to investigating the problem I was originally looking at. Why does get_request block on malformed / incomplete requests.......

      HTTP::Daemon::ClientConn::get_request blocks until it has a correct request because that's what it is documented to do.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://854169]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (12)
As of 2014-10-31 14:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    For retirement, I am banking on:










    Results (217 votes), past polls