« ニワンゴ | メイン | Catalyst 5.59でデバッグ用サーバの自動再起動がきかない。 »

CatalystのStatic::SimpleとSessionの相性が悪い

CatalystのCatalyst::Plugin::Static::SimpleとCatalyst::Plugin::Session(::State::Cookie)の相性が悪い。最悪の場合セッションキーが消されてしまう。

原因はprepare_actionの実行順で、解決策としてはプラグインのロードの順番なのだが、

use Catalyst qw/Static::Simple Session/

とした場合、
prepare_actionはStatic::Simpleの方が先に実行される。ところがStatic::Simpleのprepare_actionは、

return $c->NEXT::ACTUAL::prepare_action(@_);

で終わるため、Sessionではなく、SUPER:: prepare_action(つまり、、、Catalyst:: prepare_action?)と同じ事になってしまい、Sessionをロードするための、Session:: prepare_actionが読み出されなくなってしまう。

解決策はプラグインのロードの順番で、

use Catalyst qw/Session Static::Simple/

とすればいい。ドキュメントにも書いてありました。

This can be helpful by skipping session cookie checks for example. Or, if you want some plugins to run even on static files, list them before Static::Simple.

ただし、その「session cookie checks」のskipが原因だったのですが。

かなり悩んでしまった。


実際の問題点は、Catalyst::Plugin::Sessionのdump_theseかなぁ

 $c->sessionid
        ? ( [ "Session ID" => $c->sessionid ], [ Session => $c->session ], )
        : ()

Catalyst::Plugin::Session::State::Cookieでsessionidが設定されているから、「$c->session」が実行されてしまい、sessionメソッドの中でgenerate_session_idしてしまうと。修正するなら、

 $c->sessionid && $c->{session}
        ? ( [ "Session ID" => $c->sessionid ], [ Session => $c->session ], )
        : ()

かなぁ。。