in reply to HTTP::Daemon not working in threads?

Update:

See A simple web server with HTTP::Daemon and threads, which clearly points out the problem in the original post.

Original:

Instead of using HTTP::Daemon you used, I used IO::Socket::INET directly, but don't think that's what caused your problem.
proxy.pl: use strict; use threads; use IO::Socket::INET; $| ++; my $listener = IO::Socket::INET->new(LocalPort => 3126, Listen => 5, Reuse => 1) || die "Cannot create socket\n"; my $client; my $client_num = 0; while (1) { $client = $listener->accept; threads->create(\&start_thread, $client, ++ $client_num); } sub start_thread { threads->self->detach(); my ($client, $client_num) = @_; print "thread created for client $client_num\n"; while (1) { my $whole_req = ""; do { my $req; $client->recv($req, 700000); return if ($req eq ""); $whole_req = $whole_req . $req; } until ($whole_req =~ m/\r\n\r\n/x); print "client $client_num got req:\n$whole_req"; $whole_req =~ m/Host: ([\.|\w]*)/; my $host = $1; my $server = new IO::Socket::INET(Proto => "tcp", PeerPort => 80, PeerAddr => $host) || die "failed to connect to $host\n"; print $server $whole_req; my $whole_res = ""; do { my $res; $server->recv($res, 700000); $whole_res = $whole_res . $res; } until ($whole_res =~ m/<\/html>/); print "client $client_num got res\n"; print $client $whole_res; close($server); } return; } tester.pl: use strict; use IO::Socket; my $server = IO::Socket::INET->new(Proto => "tcp", PeerPort => 3126, PeerAddr => "localhost", Timeout => 2000) || die "failed to connect\n"; my $req = "GET / HTTP/1.1\r\nHost: $ARGV[0]\r\n\r\n"; while (1) { print $req; print $server $req; my $res; my $whole_res = ""; do { $server->recv($res, 70000); exit if ($res eq ""); $whole_res = $whole_res . $res; } until ($res =~ m/<\/html>/); print $whole_res; }

Replies are listed 'Best First'.
Re: Re: HTTP::Daemon not working in threads?
by Anonymous Monk on Nov 25, 2002 at 14:52 UTC
    Thank you for the reply.
    
    I was just trying to not "reinvent the wheel". 
    
    I now believe that HTTP::Daemon, and probably the entire
    LWP library do not work properly in threads, at least on
    Windows, for one reason or another :(.
    
    I wanted to use HTTP::Daemon so I can access get_request
    and the corresponding HTTP::Request returned object.
    Similarily for the send side. The IO::Socket::INET is lower
    level and I need to "reinvent the wheel" and receive
    and parse the headers and possibly data in POST
    request. Basically re-doing the get_request.
    
    Is $sock->recv() less blocking than $sock->read?
    I think that $sock->recv() loop to receive the data as in
    your example might go into CPU loop waiting for data.
    $sock->read() might not but sometime is blocking too much.
    I think if I use threads I can let socket read/write block,
    but I must find the right number of bytes to read first,
    might be impossible as in waiting for enf-of-http-header mark.
    
    JM.