このブログではまず滅多にPerlの話を書かないのだけど、実は仕事ではPerlばっかり書いてたりする。にもかかわらず最近RubyRuby言いすぎなので、このままではマズい、社内のPerl Mongerな方々にトゥシューズに画鋲を入れられたり机に花を飾られたりしてしまう(※)、ということで今週末はHTTP::Engineをいじってみることにした。

※Perl Mongerはそんな陰湿ないじめはしませんし、Rubyistを公言してると社内で立場が危うくなるなんてことももちろんありませんし、そう言えばトゥシューズなんか履いたことないや。

比較の為に「彼女が404」を作ろうかと思ったんだけど、そのまんま同じのを作ってもあんまり芸がないので「うどん屋が403」にしてみた。彼女のと同じくGET、POST、PUT、DELETEに対応しててそれぞれ違うレスポンスを返すので、適当にリクエスト投げてみてくだしあ。

ファイルの構成はこんな感じ。

UdonApp.pm
うどん屋のステータスを返すアプリ。
UdonMap.pm
Rack::URLMapもどき。パスとアプリを関連付けてアプリのhandle_requestを呼ぶ。要Path::Dispatcher。
UdonHandler.pm
UdonMapを呼ぶためのmod_perl2用のハンドラ。PerlSetEnvでAPP_BASE_DIR(必須)とAPP_LOCATION(任意)を設定できる。APP_BASE_DIRはviewのディレクトリを決定するのに、APP_LOCATIONは例えば/perl/resource/udonみたいなパスでアクセスさせたいときに「PerlSetEnv /perl」みたいにして使う。
server.pl
実行するとスタンドアロンでサーバ立ち上げる。
server-switch.pl
server.plを「HTTP::Engine をつかった、ごくシンプルなプログラムの例(The simple example code for HTTP::Engine) - TokuLog 改めB日記」を参考に直したもの。要Perl5.10。なんで最初からそう書かなかったのかと言うと、Macの方のPerlが5.8なので…。given-whenの方が好みだなぁ。
server-urlmap.pl
server.plをUdonMapを使うように直したもの。これが一番すっきりするかなぁ。ていうかしないとUdonMapの意味無いけど。
udon.cgi
CGI。普通にApacheとかで動く。
*.msn
viewファイル。

ちょっと構成変えた。モジュールはUdon*.pmからlib/Udon/*.pmに、テンプレートは*.msnからview/*.msnに、スクリプトは*.plからbin/*.plに移動。

Ruby版の挙動になるべくあわせるようにしようとして、わざわざURLMapもどきを作ってしまった。Path::Dispatcherの無駄遣いな感が否めない。本当はPath::Dispatcherはもっと色々できる高機能なディスパッチャなので、WAFを作るときはUdonMapにあたるところがディスパッチャでUdonAppがアプリケーションじゃなくてコントローラ、的な構成にすると思うけど、まぁRackのプチアプリとの比較ってことでその辺は御愛嬌。

今思ったけど、これHTTP::Engine::Middlewareとかで実装すべきかしら。というかすでにこんなのあったりしそう。まだMiddlewareの方はちゃんと追えてないので後で。やってみた。次の記事参照。

ちなみにテンプレートにはText::MicroMason::SafeServerPagesを使った。普段使ってないテンプレートエンジンを試してみたかったってだけなので、特に意味はない。でも良いな、TTよりよっぽど素直に書けて好きだ。

参考にしたもの