2011-01-27 136 views
0

我有Windows XP和ActiveState公司的ActivePerl 5.8下面的代码。HTTP ::守护进程和线程

什么能与它的问题呢?为什么它不起作用?

我试图将其设置为代理服务器,以我的IE浏览器,但是当我连接到某些网址从我的IE浏览器没有任何反应。代码进入线程函数并没有任何反应。

use HTTP::Daemon; 
use threads; 
use HTTP::Status; 
use LWP::UserAgent; 

my $webServer; 
my $d = HTTP::Daemon->new(
    LocalAddr => '127.0.0.1', 
    LocalPort => 80, 
    Listen => 20 
) || die; 

print "Web Server started!\n"; 
print "Server Address: ", $d->sockhost(), "\n"; 
print "Server Port: ", $d->sockport(), "\n"; 

while (my $c = $d->accept) { 
    threads->create(\&process_one_req, $c)->detach(); 
} 

sub process_one_req { 
    STDOUT->autoflush(1); 
    my $c = shift; 
    while (my $r = $c->get_request) { 
     if ($r->method eq "GET") { 
      print "Session info\n", $r->header('Host'); 
      my $ua  = LWP::UserAgent->new; 
      my $response = $ua->request($r); 
      $c->send_response($response); 

     } else { 
      $c->send_error(RC_FORBIDDEN); 
     } 

    } 
    $c->close; 
    undef($c); 
} 

回答

0

我在LWP :: UserAgent-> new之前添加了下面一行代码,它似乎在为我工作(在linux中)。

$r->uri("http://" . $r->header('Host') . "/" . $r->uri()); 

,你从原来的请求没有主机名的HTTP :: Request对象获得的URI。所以添加它使其成为绝对的uri。测试如下:

$ curl -D - -o /dev/null -s -H 'Host: www.yahoo.com' http://localhost:8080/ 
HTTP/1.1 200 OK 
Date: Thu, 27 Jan 2011 12:59:56 GMT 
Server: libwww-perl-daemon/5.827 
Cache-Control: private 
Connection: close 
Date: Thu, 27 Jan 2011 12:57:15 GMT 
Age: 0 
---snip-- 

更新:看起来我是完全错误的。我并不需要对URI对象进行更改。您的原始代码适用于我,因为它在Linux中是如此的

0

如果我没有记错,这是因为Windows中的线程模型,除非特别要求,文件句柄不在进程之间传递。 This PerlMonks post似乎揭示了一些潜在的问题,并可能导致一种适用于您的方法(我想您可能能够在客户端连接的文件描述符上调用Windows API以允许在产生的内容中访问它线)。

Windows上的Perl线程通常会让我头疼,而在UNIX-list系统中,我发现它们很容易处理。然后,我想象一下如何正确使用分叉进程来模拟只支持线程的系统上的线程,而不是分叉会导致大多数人的头部受伤。