use Lint

psgiなアプリをかいてて今まで動いていたのに
Shotgunを使い始めたらエラーが出てしまった。

もともとのアプリは大体こんなの

use Proj::Container qw/api/;
use Plack::Builder;

builder {
    mount '/banner/' => sub {
        my $env = shift;
        my $rid = $env->{PATH_INFO} || '';
        $rid =~ s!/!!;

        return [
            '200',
            [
                'Content-Type'  => 'image/gif',
                'X-REPROXY-URL' => 'http://127.0.0.1:7000/'.$rid,
            ],
        ];
    };
};

バナー画像をreproxy urlをつかって配信してたの。

なんかShotgunでエラーがでるーとか騒いだら
tokuhiromさんとmiyagawaさんから色々教えていただきました。

http://advent.plackperl.org/2009/12/day-21-lint-your-application-and-middleware.html

そもそもPSGIの仕様から外れたレスポンスを返してるんですね。
アホですね。

use Proj::Container qw/api/;
use Plack::Builder;

builder {
    mount '/banner/' => sub {
        my $env = shift;
        my $rid = $env->{PATH_INFO} || '';
        $rid =~ s!/!!;

        return [
            '200',
            [
                'Content-Type'  => 'image/gif',
                'X-REPROXY-URL' => 'http://127.0.0.1:7000/'.$rid,
            ],
            []
        ];
    };
};

なのでこうするだけ。
で、そもそもPSGIの仕様にそってるかどうかをミドルウエアでチェックできると教えてもらったので
enable 'Lint'するとよいでしょう。

use Proj::Container qw/api/;
use Plack::Builder;

builder {

    enable 'Lint';

    mount '/banner/' => sub {
        my $env = shift;
        my $rid = $env->{PATH_INFO} || '';
        $rid =~ s!/!!;

        return [
            '200',
            [
                'Content-Type'  => 'image/gif',
                'X-REPROXY-URL' => 'http://127.0.0.1:7000/'.$rid,
            ],
            []
        ];
    };
};

これで、PSGIの仕様に外れているとdieしてくれました。

しかしShotgun素晴らしすぎるのでみんな使うといいと思います。
http://d.hatena.ne.jp/sugyan/20100404/1270320069