releng for Cookie
[catagits/Catalyst-Plugin-Session-State-Cookie.git] / lib / Catalyst / Plugin / Session / State / Cookie.pm
index 5319500..aa0e61a 100644 (file)
@@ -7,53 +7,86 @@ use warnings;
 use NEXT;
 use Catalyst::Utils ();
 
-our $VERSION = "0.02";
+our $VERSION = "0.06";
 
 sub setup_session {
     my $c = shift;
 
     $c->NEXT::setup_session(@_);
+
     $c->config->{session}{cookie_name}
         ||= Catalyst::Utils::appprefix($c) . '_session';
 }
 
-sub finalize_cookies {
-    my $c = shift;
+sub extend_session_id {
+    my ( $c, $sid, $expires ) = @_;
 
-    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( $sid ) );
     }
 
-    return $c->NEXT::finalize_cookies(@_);
+    $c->NEXT::extend_session_id( $sid, $expires );
+}
+
+sub set_session_id {
+    my ( $c, $sid ) = @_;
+
+    $c->update_session_cookie( $c->make_session_cookie( $sid ) );
+
+    return $c->NEXT::set_session_id($sid);
 }
 
 sub update_session_cookie {
     my ( $c, $updated ) = @_;
-    my $cookie_name = $c->config->{session}{cookie_name};
-    $c->response->cookies->{$cookie_name} = $updated;
+    
+    unless ( $c->cookie_is_rejecting( $updated ) ) {
+        my $cookie_name = $c->config->{session}{cookie_name};
+        $c->response->cookies->{$cookie_name} = $updated;
+    }
+}
+
+sub cookie_is_rejecting {
+    my ( $c, $cookie ) = @_;
+    
+    if ( $cookie->{path} ) {
+        return 1 if index '/'.$c->request->path, $cookie->{path};
+    }
+    
+    return 0;
 }
 
 sub make_session_cookie {
-    my $c = shift;
+    my ( $c, $sid, %attrs ) = @_;
 
     my $cfg    = $c->config->{session};
     my $cookie = {
-        value => $c->sessionid,
+        value => $sid,
         ( $cfg->{cookie_domain} ? ( domain => $cfg->{cookie_domain} ) : () ),
+        ( $cfg->{cookie_path} ? ( path => $cfg->{cookie_path} ) : () ),
+        %attrs,
     };
 
-    $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 +96,36 @@ 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, $sid ) = @_;
+
+    $c->update_session_cookie( $c->make_session_cookie( $sid, expires => 0 ) );
+
+    $c->NEXT::delete_session_id($sid);
 }
 
 __PACKAGE__
@@ -159,6 +204,10 @@ user's browser is shut down.
 
 If this attribute set true, the cookie will only be sent via HTTPS.
 
+=item cookie_path
+
+The path of the request url where cookie should be baked.
+
 =back
 
 =head1 CAVEATS