2011-01-27 22 views
0

Windows XPとActiveState ActivePerl 5.8には次のコードがあります。HTTP ::デーモンとスレッド

何が問題なのですか?なぜそれは機能しませんか?

IEのプロキシとして設定しようとしましたが、私のIEからいくつかのURLに接続すると何も起こりません。コードはスレッド関数に入り、何も起こりません。

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には、ホスト名が含まれていません。だからそれを絶対的なものにするためにそれを加えました。次のようにテストされました:

$ 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-- 

UPDATE:完全に間違っていたようです。私はURIオブジェクトに変更を加える必要はありませんでした。あなたの元のコードはLinuxのまま私のために働いた

0

私が正しく思い出したのは、Windowsのスレッディングモデルのためです。 This PerlMonks postは根本的な問題を明らかにし、あなたのために働くアプローチにつながるかもしれません(クライアント接続のファイル記述子でWindows APIを呼び出して、生成されたファイル内のアクセスを許可することができると思います糸)。

WindowsのPerlスレッドは一般的に私の頭を傷つけますが、UNIXリストシステムでは処理が非常に簡単です。次に、フォークされたプロセスを正しく使用して、スレッドをサポートし、フォークをサポートしないシステム上のスレッドをエミュレートする方法を考えてみると、ほとんどの人の頭が痛いでしょう。

関連する問題