Session changes, no docs
Yuval Kogman [Wed, 10 May 2006 20:45:16 +0000 (20:45 +0000)]
Expiry protocol changed
State plugins now implement get_session_id, set_session_id and delete_session_id

lib/Catalyst/Plugin/Session/State/Cookie.pm
t/basic.t

index 5319500..2ad97b7 100644 (file)
@@ -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__
index 52cba05..9620451 100644 (file)
--- 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"
 );
-