2008年04月23日

Cisco Catalystシリーズの勉強会という事で参加したのに、全然違うPerlとか良くわからないやつの勉強会でした。
とりあえずCatalystにログインした所からスタートしたんだけど反応がなくて、enした辺りでようやくhiroseさんが笑ってくれました。
とりあえずshow confしたけど無反応で酷い温度差でしたね。

なんだかサンフランCiscoとかPlugin使わないよJKとかいう言葉が飛び交ったり、発表者全てがCatalystをDISっていましね。
nothingmuchがスペシャルゲストとして来てくれたお陰でプチYAPCというか前々前夜祭くらいのノリになっていました。

しょうがないのでCatalyst::Engineを抜き出して再利用できるようにしたHTTP::Server::Wrapperというのを作ったので、それのプレゼンを行いました。
超簡単に説明するとWSGIのPerlバージョン
ただCatalyst::Engineを抜き出しても拡張性がなさ過ぎでいけてないので、Class::Componentを使ってプラガブルに風味にしてあります。
Session処理とか認証処理なんかは基本的にWAF側じゃなくてエンジン側の仕事じゃないかと思っているので、そのあたりもサクッと作れるようにしたい所です。

資料はhttp://svn.coderepos.org/share/docs/yappo/20080422-catalystcon1/catalystcon.pl
一応Partty.orgで録画してあります。
コードはhttp://svn.coderepos.org/share/lang/perl/HTTP-Server-Wrapper/trunk/から。
もうちょっと形を整えたらCPANします。
ついでにhidekさんが開発してるOkinaというWAFにもHTTP::Server::Wrapper対応しときました。

HTTP::Server::Wrapperを使うと本当に簡単にHTTPサーバを内蔵したアプリが書けます。
もちろんWAFとかをこれベースで作るとEngine処理にからむPluginを使い回せるのでとても良いです。
設定

using_frontend_proxy: 1
plugins:
    - module: Engine::Standalone
      conf:
        host: 0.0.0.0
        port: 14000
を書いて、それを実行するサーバアプリは
use strict;
use warnings;
use lib 'lib';
use HTTP::Server::Wrapper;
use Data::Dumper;
HTTP::Server::Wrapper->new('config.yaml', handle_request => sub {my $e = shift; $e->env('DUMY'); $e->res->body(Dumper($e)) } )->run;
こんな感じでブラウザでアクセスしたら、engineの中身を全部Dumpして表示するようなのが簡単に書けます!

HTTP::Server::Wrapperを使ったサーバを書くのは非常に簡単で、newする時に handle_request メソッドを定義すると、ブラウザからアクセスがあるたびに定義したメソッドが呼ばれます。
引数は今の所Engineのコンテキストです。
$engine->req で Catalyst::Request 相当。
$engine->res で Catalyst::Response 相当。
のオブジェクトにアクセスします。

いまコミットしてあるのはコンセプト的な実装で、とりあえず動かすためにSoozy::(?:Engine::HTTP|Request|Response)からのコピペです。
実際これらの大部分はCatalystからのコピペなので、Catalyst::Engineを切り離した感じ。
というコンセプト実装なので、これからより実用的に使えるように皆で変更していったらいいと思います。
名前もそれっぽいのになるといいよね。

ある程度実用的になったらCatalyst::Engine::Wrapperとか書こうと思う。
どうぞご利用下さい。

Posted by Yappo at 2008年04月23日 11:44 | TrackBack | Perl
Comments
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。