Выполняя небольшую RTFS, Session.pm
переопределяет метод Catalyst finalize_headers
и устанавливает туда cookie через довольно глубокую цепочку вызовов:
finalize_header
⇒ _save_session_expires
⇒ session_expires
⇒ _extended_session_expires
⇒ extend_session_id (…::Session::State::Cookie)
⇒ update_session_cookie (…::Session::State::Cookie)
Похоже, что нет никакого способа пометить что-либов цепи, чтобы остановиться. Единственной проверкой является метод в Cookie.pm
, называемый cookie_is_rejecting
, который просто сравнивает настроенный путь cookie с путем запроса.
Таким образом, похоже, что лучший способ сделать это - добавить собственное переопределение влибо update_session_cookie
, либо cookie_is_rejecting
. Я думаю, что я буду использовать cookie_is_rejecting
.
Вот код, который я наконец-то использовал. Обратите внимание, что это довольно глупо, но работает ...
package Catalyst::Plugin::Session::State::Cookie::Sanity;
use base qw/Catalyst::Plugin::Session::State::Cookie/;
use MRO::Compat;
use strict;
sub cookie_is_rejecting {
my ($c, $cookie) = @_;
($c->stash->{cache_control_time} // 0) > 0
or $c->maybe::next::method( $c, $cookie );
}
1;