Middlewareに対応するJavaのServlet Filter
JavaでいうところのWSGIのMiddlewareに相当するインターフェースとポイントを書き出してみた。
package Filter; use Moose::Role; requires 'init', 'destroy','do_filter'; 1;
package FilterChain; use Moose; with 'Filter'; sub init{ } has 'filters' => ( metaclass => 'Collection::Array', is => 'ro', isa => 'ArrayRef', default => sub { [] }, ); sub destroy{ } no Moose; __PACKAGE__->meta->make_immutable; 1;
packaeg MyFilter; use Moose; with 'Filter'; sub init { my ($self, $conf) = @_; } sub do_filter { my ($self, $request, $response, $filter_chain) = @_; // requestの処理 // 後続のfilter実行 $filter_chain.do_filter($request, $response); // responseの処理 } sub destroy { } no Moose; __PACKAGE__->meta->make_immutable; 1;
Middlewareをchainさせる部分
FilterChainのようにchainさせる方法は、同じような感じでも、modifierでも、Class::C3だったり何でもいいんだろうなぁと。
requst handler
do_filterがいわゆるrequest_handlerなんですが、Catalystのrequest lifecycleのように細かくフックできるようにしてもいいし、Servlet Filterみたいにおおざっぱなレベルでもいいのかもしれない。
hook pointの指定はmodifierでやるか、Class::Triggerで明示的に指定するののいずれかなんだろうなぁと。
Middlewareのconfig
ServletFilterと同じく、Middlewareの初期化時にconfigurationを渡せる必要があるんだろうなぁと。
後はここには書いてないけれど、Filterはどのrequest pathに適用するのかが書けるようになっている。