From: Yuval Kogman Date: Wed, 10 May 2006 20:45:16 +0000 (+0000) Subject: Session changes, no docs X-Git-Tag: v0.03~4 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Plugin-Session-State-Cookie.git;a=commitdiff_plain;h=2bde9162132ed51c98e86106f3b9be65459c12a3 Session changes, no docs Expiry protocol changed State plugins now implement get_session_id, set_session_id and delete_session_id --- diff --git a/lib/Catalyst/Plugin/Session/State/Cookie.pm b/lib/Catalyst/Plugin/Session/State/Cookie.pm index 5319500..2ad97b7 100644 --- a/lib/Catalyst/Plugin/Session/State/Cookie.pm +++ b/lib/Catalyst/Plugin/Session/State/Cookie.pm @@ -13,6 +13,7 @@ sub setup_session { my $c = shift; $c->NEXT::setup_session(@_); + $c->config->{session}{cookie_name} ||= Catalyst::Utils::appprefix($c) . '_session'; } @@ -20,11 +21,19 @@ sub setup_session { sub finalize_cookies { my $c = shift; - if ( $c->sessionid ) { - $c->update_session_cookie( $c->make_session_cookie ); + if ( my $cookie = $c->get_session_cookie ) { + $c->update_session_cookie( $c->make_session_cookie( $cookie->value ) ); } - return $c->NEXT::finalize_cookies(@_); + $c->NEXT::finalize_cookies( @_ ); +} + +sub set_session_id { + my ( $c, $sid ) = @_; + + $c->update_session_cookie( $c->make_session_cookie( $sid ) ); + + return $c->NEXT::set_session_id(@_); } sub update_session_cookie { @@ -34,26 +43,36 @@ sub update_session_cookie { } sub make_session_cookie { - my $c = shift; + my ( $c, $sid, %attrs ) = @_; my $cfg = $c->config->{session}; my $cookie = { - value => $c->sessionid, + value => $sid, + %attrs, ( $cfg->{cookie_domain} ? ( domain => $cfg->{cookie_domain} ) : () ), }; - $cookie->{expires}=$c->calc_expiry(); + unless ( exists $cookie->{expires} ) { + $cookie->{expires} = $c->calculate_session_cookie_expires(); + } $cookie->{secure} = 1 if $cfg->{cookie_secure}; return $cookie; } -sub calc_expiry { - my $c=shift; - my $cfg = $c->config->{session}; - my $value= $c->NEXT::calc_expiry(@_); +sub calc_expiry { # compat + my $c = shift; + $c->NEXT::calc_expiry( @_ ) || $c->calculate_session_cookie_expires( @_ ); +} + +sub calculate_session_cookie_expires { + my $c = shift; + my $cfg = $c->config->{session}; + + my $value = $c->NEXT::calculate_session_cookie_expires(@_); return $value if $value; + if ( exists $cfg->{cookie_expires} ) { if ( $cfg->{cookie_expires} > 0 ) { return time() + $cfg->{cookie_expires}; @@ -63,24 +82,34 @@ sub calc_expiry { } } else { - return $c->session_expires; + return $c->session_expires; } } -sub prepare_cookies { +sub get_session_cookie { my $c = shift; - my $ret = $c->NEXT::prepare_cookies(@_); - my $cookie_name = $c->config->{session}{cookie_name}; - if ( my $cookie = $c->request->cookies->{$cookie_name} ) { + return $c->request->cookies->{$cookie_name}; +} + +sub get_session_id { + my $c = shift; + + if ( my $cookie = $c->get_session_cookie ) { my $sid = $cookie->value; - $c->sessionid($sid); $c->log->debug(qq/Found sessionid "$sid" in cookie/) if $c->debug; + return $sid if $sid; } - return $ret; + $c->NEXT::get_session_id(@_); +} + +sub delete_session_id { + my $c = shift; + $c->NEXT::delete_session_id(); + delete $c->response->cookies->{ $c->config->{session}{cookie_name} }; } __PACKAGE__ diff --git a/t/basic.t b/t/basic.t index 52cba05..9620451 100644 --- a/t/basic.t +++ b/t/basic.t @@ -3,7 +3,7 @@ use strict; use warnings; -use Test::More tests => 15; +use Test::More tests => 10; use Test::MockObject; use Test::MockObject::Extends; @@ -42,76 +42,32 @@ like( $cxt->config->{session}{cookie_name}, $cxt->config->{session}{cookie_name} = "session"; -can_ok( $m, "prepare_cookies" ); +can_ok( $m, "get_session_id" ); -$cxt->prepare_cookies; -ok( !$cxt->called("sessionid"), - "didn't try setting session ID when there was nothing to set it by" ); +ok( !$cxt->get_session_id, "no session id yet"); $cxt->clear; %req_cookies = ( session => $cookie ); -ok( !$cxt->sessionid, "no session ID yet" ); -$cxt->prepare_cookies; -is( $cxt->sessionid, "the session id", "session ID was restored from cookie" ); +is( $cxt->get_session_id, "the session id", "session ID was restored from cookie" ); $cxt->clear; $res->clear; -can_ok( $m, "finalize_cookies" ); -$cxt->finalize_cookies; -{ - local $TODO = - "This check is a pain to write, should be done by catalyst itself"; - ok( !$res->called("cookies"), - "response cookie was not set since res cookie is already there" ); -} +can_ok( $m, "set_session_id" ); +$cxt->set_session_id("moose"); -$cxt->clear; -$sessionid = undef; -$res->clear; - -$cxt->finalize_cookies; -ok( !$res->called("cookies"), -"response cookie was not set when sessionid was deleted, even if req cookie is still there" -); +$res->called_ok( "cookies", "created a cookie on set" ); -$sessionid = "some other ID"; $cxt->clear; $res->clear; -$cxt->finalize_cookies; -$res->called_ok( "cookies", "response cookie was set when sessionid changed" ); -is_deeply( - \%res_cookies, - { session => { value => $sessionid, expires => 123 } }, - "cookie was set correctly" -); +$cxt->set_session_id($sessionid); -$cxt->clear; -$res->clear; -%req_cookies = (); -%res_cookies = (); -$sessionid = undef; - -$cxt->finalize_cookies; -ok( !$res->called("cookies"), - "response cookie was not set when there is no sessionid or request cookie" -); - -$cxt->clear; -$sessionid = "123"; -%res_cookies = (); -$res->clear; - -$cxt->finalize_cookies; - -$res->called_ok( "cookies", - "response cookie was set when session was created" ); +$res->called_ok( "cookies", "response cookie was set when sessionid changed" ); is_deeply( \%res_cookies, { session => { value => $sessionid, expires => 123 } }, "cookie was set correctly" ); -