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系統中,我發現它們很容易處理。然後,我想象一下如何正確使用分叉進程來模擬只支持線程的系統上的線程,而不是分叉會導致大多數人的頭部受傷。