add configuration of 'cookie_path'
[catagits/Catalyst-Plugin-Session-State-Cookie.git] / lib / Catalyst / Plugin / Session / State / Cookie.pm
index 7f08b29..a87ccc8 100644 (file)
@@ -7,7 +7,7 @@ use warnings;
 use NEXT;
 use Catalyst::Utils ();
 
-our $VERSION = "0.02";
+our $VERSION = "0.05";
 
 sub setup_session {
     my $c = shift;
@@ -38,8 +38,21 @@ sub set_session_id {
 
 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 {
@@ -48,8 +61,9 @@ sub make_session_cookie {
     my $cfg    = $c->config->{session};
     my $cookie = {
         value => $sid,
-        %attrs,
         ( $cfg->{cookie_domain} ? ( domain => $cfg->{cookie_domain} ) : () ),
+        ( $cfg->{cookie_path} ? ( path => $cfg->{cookie_path} ) : () ),
+        %attrs,
     };
 
     unless ( exists $cookie->{expires} ) {
@@ -107,9 +121,11 @@ sub get_session_id {
 }
 
 sub delete_session_id {
-    my $c = shift;
-    $c->NEXT::delete_session_id();
-    delete $c->response->cookies->{ $c->config->{session}{cookie_name} };
+    my ( $c, $sid ) = @_;
+
+    $c->update_session_cookie( $c->make_session_cookie( $sid, expires => 0 ) );
+
+    $c->NEXT::delete_session_id($sid);
 }
 
 __PACKAGE__
@@ -188,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