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に適用するのかが書けるようになっている。