HTTP :: Daemon и потоки - PullRequest
       20

HTTP :: Daemon и потоки

0 голосов
/ 27 января 2011

У меня следующий код в Windows XP и ActiveState ActivePerl 5.8.

В чем может быть проблема?Почему это не работает?

Я пытался установить его в качестве прокси для моего IE, но когда я подключаюсь к некоторым URL из моего 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);
}

Ответы [ 2 ]

0 голосов
/ 01 августа 2011

Если я правильно помню, это из-за модели многопоточности в Windows, где файловые дескрипторы не передаются между процессами, если это специально не запрашивается. Эта публикация PerlMonks , кажется, проливает некоторый свет на основную проблему и может привести к подходу, который работает для вас (я полагаю, вы можете вызывать Windows API для файлового дескриптора клиентского соединения).чтобы разрешить доступ к нему в порожденном потоке).

Потоки Perl в Windows обычно вызывают у меня головную боль, в то время как в системах со списком UNIX я считаю, что с ними очень легко иметь дело.Опять же, я представляю, как выяснить, как правильно использовать разветвленные процессы для эмуляции потоков в системе, поддерживающей ТОЛЬКО потоки и не разветвляющейся, может причинить боль большинству людей.

0 голосов
/ 27 января 2011

Я добавил следующую строку в код перед LWP :: UserAgent-> new, и, похоже, он работает для меня (в linux).

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

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

ОБНОВЛЕНИЕ: Похоже, я был совершенно не прав. Мне не нужно было вносить изменения в объект URI. Ваш оригинальный код работал для меня так же, как в Linux

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...