@kyanny's blog

創造性は記憶によるところが大きい - 黒澤明

HTTP::Engine 入門

HTTP-Engine-0.03005 - Web Server Gateway Interface and HTTP Server Engine Drivers - metacpan.org

  • local::lib で $HOME/perl5 以下をいろいろセットアップしてからインストール。一発で依存含めて全部入った。
  • HTTP::Engine, HTTP::Engine::Interface::ServerSimple の POD を読む
  • SYNOPSIS 通りに書いてみる→エラー→タイプミスしてた→書き直し→動いた!
  • HTTP::Engine::Request の POD も読む→ $req->param('key') とかできる
  • HTTP::Engine::Middleware もインストールする
  • HTTP::Engine::Middleware の POD も読む→なんとなく役割がわかったような、でもあやふやなような
  • SYNOPSIS を真似て書いてみる→足りないモジュール入れたり→ request_handler => $mw->handler(\&handler) のあたりがわからない、自分で handler() を実装して HTTP::Engine::Response->new( body => 'dynamic daikuma' ) とかすると当たり前っぽいけどどの URL へリクエストしてもそれしか返らない、ううむ
  • なんか根本的に勘違いしてるんだろうな、と思って色々ぐぐっている
  • Hatter のソース読んで、勘違いしてたところがなんとなくわかった。最低限一つの handler は実装する必要があって、 Middleware::Static などを install すると、特定のパターンの場合にそっちに委譲できるみたいな感じなのかな。
  • お、できた。記念に貼っとこう。
#!/usr/local/bin/perl
use strict;
use warnings;
use HTTP::Engine;
use HTTP::Engine::Middleware;
use File::Spec;
use FindBin;

my $mw = HTTP::Engine::Middleware->new;
$mw->install('HTTP::Engine::Middleware::Static' => {
	regexp => qr/^.*(\.txt|\.html)$/,
	docroot => File::Spec->catdir($FindBin::Bin, qw(public_html)),
});
my $engine = HTTP::Engine->new(
	interface => {
		module => 'ServerSimple',
		args => {
			host => 'localhost',
			port => '1978',
		},
		request_handler => $mw->handler(\&handler),
	},
);
$engine->run;

sub handler {
	my $req = shift;
	return HTTP::Engine::Response->new( body => '' );
}
-bash-3.00$ tree
.
|-- http-engine-server-simple.pl
|-- middleware-static.pl
`-- public_html
    |-- bob.html
    `-- pen.txt

1 directory, 4 files