|
|
||
Twisted はよく知らないんだけど、HTTP::Daemon はクライアントからの複数接続にも対応してない(かったと思う)し、Twisted に対抗する例はやっぱ POE の方がフレームワークっぽくていいのかなあ、なんて。
POE というと一歩身構えちゃう感じはするけど、PoCo::Server::HTTP を使えばカンタン。
以下サンプル。素で書いても SYNOPSYS と同じになっちゃうだけなので、ちょっとだけ色をつけて CGI も実行できるウェブサーバとして実装すると
#!/usr/local/bin/perl use strict; use warnings; use POE qw/Component::Server::HTTP/; use CGI; use HTTP::Request::AsCGI; my $aliases = POE::Component::Server::HTTP->new( Port => 10080, ContentHandler => { '/' => \&handler }, ); POE::Kernel->run; sub handler { my ($req, $res) = @_; my $c = HTTP::Request::AsCGI->new($req)->setup; my $q = CGI->new; $res->content_type('text/plain'); $res->content($q->user_agent); $res->code(RC_OK); return RC_OK; }
とか。
PoCo::Server::HTTP のコールバックにわたってくるレスポンスオブジェクトは HTTP::Response を継承してるので HTTP::Request::AsCGI にそのまま渡せる。ので CGI の周りもこれだけで。
裏側は POE でノンブロッキングになってるので複数同時につなぎに言ってもちゃんとレスポンスが返ると思います。多分。IE だとなんかちゃんと動かないなあ、どっかでブロックされる。うちの環境だけかな。
与太話をすると、Catalyst の server.pl は昔は HTTP::Daemon を継承しつつノンブロッキングにするところを自前で select() してたけど、今は HTTP::Daemon も使ってないみたい。
doで外部CGIを呼んだあと、$c->stdoutから読み出した結果を$resに渡すという感じです。