これにインスパイヤされて。
Python と Twisted できみにも書ける Web サーバ誰でも比較的簡単に Web サーバを書くことを可能にするのが Python と Twisted というフレームワークの組合せです。
Pure Perlで書かれたWeb Serverはそれこそ山ほどあるのですが、実はLWPにもサーバーを簡単に実装するModuleが用意されていて、それがHTTP::Daemonです。
例えば、ブラウザのリクエストをおうむ返しにするサーバーは、以下のとおりとなります。
#!/usr/local/bin/perl -T use strict; use warnings; use HTTP::Daemon; use HTTP::Date; my $d = HTTP::Daemon->new( LocalAddr => '0.0.0.0', LocalPort => shift || 8080 ) or die $!; while ( my ( $c, $peer_addr ) = $d->accept ) { while ( my $req = $c->get_request ) { my $header = HTTP::Headers->new( 'Content-Type' => 'text/plain' ); my $res = HTTP::Response->new( 200, 'OK', $header, $req->as_string ); $c->send_response($res); print_log($peer_addr, $req, $res); } $c->close; undef($c); } # you don't need this unless you need logging sub print_log { use Socket qw/sockaddr_in inet_ntoa/; # to deparse $peer_addr use bytes (); # for length my ( $peer_addr, $req, $res ) = @_; my ( $port, $iaddr ) = sockaddr_in($peer_addr); my $remote_addr = inet_ntoa($iaddr); my $remote_user = $req->headers->authorization_basic || '-'; $remote_user =~ s/:.*//o; printf qq(%s %s - [%s] "%s %s %s" %d %d\n), $remote_addr, $remote_user, time2str( time() ), $req->method, $req->url, $req->protocol, $res->code, bytes::length( $res->content ); } __END__
一応stdoutにCommon Logを吐くように書きましたが、logすら不要ならprint_log()も不要なので、20行未満でWeb Serverの出来上がりです。
もちろん、HTTP::Daemonという名前に反して、プロセスをdaemon化したりまではしてくれないので、本格的なWeb Serverを書くならCookbookの第17章を参考にしたり、POEを使うなりするべきですが、意外なところにお宝が隠れている例としてHTTP::Daemonを取り上げた次第です。
Enjoy!
Dan the Daemon
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。