スタンドアロンWebサーバ書くのにPOEはいいかも

スタンドアロンWebサーバ書くのにPOE::Component::Server::HTTPはかなりお手軽ですね。エラー処理とかいろいろはしょると以下のコードで、Webサーバが走ります。

use strict;
use warnings;

use POE qw( Component::Server::HTTP Sugar::Args );

my $httpd_aliases = POE::Component::Server::HTTP->new(
    Port => 8080,
    ContentHandler => {
        '/' => \&httpd_index,
    }
);

sub httpd_index {
    my ($request, $response) = @_;

    $response->code(RC_OK);
    $response->content('Hello, POE!');

    return RC_OK;
}

POE::Kernel->run;

exit 0;

$requestと$responseはそれぞれHTTP::RequestとHTTP::Responseのオブジェクトになっているので、その部分を自分でいじれば良いな。

Ctrl+Cで落ちないので、killしてください。きちんと終了するには以下のコードをPOE::Kernel->runするまえに

POE::Session->create(
    inline_states => {
        _start => \&_start,
        shutdown => \&shutdown,
    },
);

sub _start {
    my $poe = sweet_args;

    $poe->kernel->sig( INT => 'shutdown' );
}

sub shutdown {
    my $poe = sweet_args;

    $poe->kernel->call( $httpd_aliases->{httpd}, 'shutdown');
}

と言う感じで。

これだけで、きちんと動く高速なWebサーバが使えるのは便利だわー。これ以外にもすてきなスタンドアロンWebサーバ向けモジュールってあるのかしら。

POEプログラミングはまだなかなか慣れないけど、コードをいろいろ書いているうちにPOE流がわかりつつあるところ。POE::SessionがPOE::Kernelの中でどう動いているのかをきちんと把握しときたいとこだわ。