Status code needs to be an integer greater than or equal to 100

CatalystっていうPerlのWAFでアプリケーション書いていたらPlackのエラーにあたったので、先輩に助けてもらって時のメモ。

Status code needs to be an integer greater than or equal to 100: HASH(0x45f00e8) at local/lib/perl5/Plack/Middleware/Lint.pm line 116

ブラウザで表示したときのエラー画面が、WAFによるものとは違う。
Catalyst::Plugin::StatusMessageを使おうとしてSYNOPSISに沿ってユーザ認証の成否を文字列でstashに入れてたんだけど、本番環境に入れてみたらこのエラーがいきなり出た。

stashに文字を入れるところをコメントアウトすると、普通にエラー画面は出なかった。

Status codeとエラーが出てPlackが指示されていたので、Plack::Requestのredirectメソッドのソースを読むと、

sub redirect {
    my $self = shift;

    if (@_) {
        my $url = shift;
        my $status = shift || 302;
        $self->location($url);
        $self->status($status);
    }

    return $self->location;
}

第二引数が無いときは302を入れてるようなので、文字列入れたらダメっぽい。
このプラグイン自体がPSGIに準拠していないのかな...?

ということで、該当する処理を消したらちゃんと動いた。

ちなみに開発環境で大丈夫なのに本番環境でのみエラーが出た現象について。
開発時は動作確認に

$ plenv exec carton exec APP_ROOT/script/APP_server.pl

Catalyst::ScriptRunner->run()を使っている。
しかし、本番環境ではPlackをSupervisorで監視しているので、

$ plenv exec carton exec plackup script/APP.psgi

で立ち上げていて、この場合はPSGI準拠でないとばっちりエラーが出る。

ここらへんも合わせたほうが良さそう。

ソースコードちゃんと読めよ」って話ですねスイマセン