naoyaの日記 RSSフィード

 | 

2006-11-13

PerlHTTP server 20:41

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 も使ってないみたい。

それ Ruby で、の例は WEBRick を使って三行ぐらいでRuby厨が書いてくれると思います。

hassylinhassylin2007/01/31 20:08$cってどこでつかってるんだろ??(初心者)

naoyanaoya2007/01/31 21:51enviroment and descriptors will automatically be restored when $c is destructed. (via http://search.cpan.org/~chansen/HTTP-Request-AsCGI-0.5/lib/HTTP/Request/AsCGI.pm )

hassylinhassylin2007/02/01 17:58ありがとうございます。書いてあったんですね。英語に負けないようにがんばります。

hassylinhassylin2007/02/02 20:11その後、試行錯誤して今まで作成したCGIを呼び出すことに成功しました。
doで外部CGIを呼んだあと、$c->stdoutから読み出した結果を$resに渡すという感じです。

 | 
この日記のはてなブックマーク数