[libcatalyst-modules-perl] 08/12: Update Catalyst-Plugin-Session to 0.39

Damyan Ivanov dmn at moszumanska.debian.org
Thu May 8 14:59:13 UTC 2014


This is an automated email from the git hooks/post-receive script.

dmn pushed a commit to branch dam-bundle-2.0
in repository libcatalyst-modules-perl.

commit b9f1c45203d35db537b700c983ed0972a9fd098b
Author: Damyan Ivanov <dmn at debian.org>
Date:   Thu May 8 13:54:59 2014 +0000

    Update Catalyst-Plugin-Session to 0.39
---
 sources/Catalyst-Plugin-Session/Changes            |  13 ++-
 sources/Catalyst-Plugin-Session/MANIFEST           |   3 +
 sources/Catalyst-Plugin-Session/META.yml           |   3 +-
 sources/Catalyst-Plugin-Session/Makefile.PL        |   1 +
 sources/Catalyst-Plugin-Session/README             |  16 ++-
 .../lib/Catalyst/Plugin/Session.pm                 | 117 ++++++++++++++++-----
 sources/Catalyst-Plugin-Session/t/01_setup.t       |   2 +-
 .../Catalyst-Plugin-Session/t/lib/SessionExpiry.pm |  21 ++++
 .../t/lib/SessionExpiry/Controller/Root.pm         |  28 +++++
 .../t/lib/SessionTestApp.pm                        |   1 -
 .../t/live_expiry_threshold.t                      |  81 ++++++++++++++
 11 files changed, 253 insertions(+), 33 deletions(-)

diff --git a/sources/Catalyst-Plugin-Session/Changes b/sources/Catalyst-Plugin-Session/Changes
index 60ce0ef..5a3e222 100644
--- a/sources/Catalyst-Plugin-Session/Changes
+++ b/sources/Catalyst-Plugin-Session/Changes
@@ -1,7 +1,18 @@
 Revision history for Perl extension Catalyst::Plugin::Session
 
+0.39 2013-10-16
+      - Fixed a bug when "expiry_threshold" is non-zero, where changes to the
+      session were not saved.
+
+0.38 2013-09-18
+      - New feature: "expiry_threshold" which allows you more control over when
+      this plugin checks and updates the expiration date for the session.
+      This is useful when you have high traffic and need to reduce the number
+      of session expiration hits (like if you are using a database for sessions
+      and your db is getting pounded).
+
 0.37 2013-02-25
-      - Fix t/live_verify_address.t to skip of Catalyst::Plugin::Authentication
+      - Fix t/live_verify_address.t to skip if Catalyst::Plugin::Authentication
         is not installed, fixing RT#81506.
 
 0.36 2012-10-19
diff --git a/sources/Catalyst-Plugin-Session/MANIFEST b/sources/Catalyst-Plugin-Session/MANIFEST
index 31e1066..252c5d5 100644
--- a/sources/Catalyst-Plugin-Session/MANIFEST
+++ b/sources/Catalyst-Plugin-Session/MANIFEST
@@ -27,12 +27,15 @@ t/author/podcoverage.t
 t/cat_test.t
 t/lib/FlashTestApp.pm
 t/lib/FlashTestApp/Controller/Root.pm
+t/lib/SessionExpiry.pm
+t/lib/SessionExpiry/Controller/Root.pm
 t/lib/SessionTestApp.pm
 t/lib/SessionTestApp/Controller/Root.pm
 t/lib/SessionValid.pm
 t/lib/SessionValid/Controller/Root.pm
 t/live_accessor.t
 t/live_app.t
+t/live_expiry_threshold.t
 t/live_session_fixation.t
 t/live_verify_address.t
 t/live_verify_user_agent.t
diff --git a/sources/Catalyst-Plugin-Session/META.yml b/sources/Catalyst-Plugin-Session/META.yml
index 41085d3..86459e0 100644
--- a/sources/Catalyst-Plugin-Session/META.yml
+++ b/sources/Catalyst-Plugin-Session/META.yml
@@ -26,6 +26,7 @@ requires:
   Digest: 0
   File::Spec: 0
   File::Temp: 0
+  List::Util: 0
   MRO::Compat: 0
   Moose: 0.76
   MooseX::Emulate::Class::Accessor::Fast: 0.00801
@@ -37,4 +38,4 @@ requires:
 resources:
   license: http://dev.perl.org/licenses/
   repository: git://git.shadowcat.co.uk/catagits/Catalyst-Plugin-Session.git
-version: 0.37
+version: 0.39
diff --git a/sources/Catalyst-Plugin-Session/Makefile.PL b/sources/Catalyst-Plugin-Session/Makefile.PL
index 48798d6..a9beeef 100644
--- a/sources/Catalyst-Plugin-Session/Makefile.PL
+++ b/sources/Catalyst-Plugin-Session/Makefile.PL
@@ -18,6 +18,7 @@ requires 'namespace::clean' => '0.10';
 requires 'Digest';
 requires 'File::Spec';
 requires 'File::Temp';
+requires 'List::Util';
 requires 'Object::Signature';
 requires 'MRO::Compat';
 requires 'MooseX::Emulate::Class::Accessor::Fast' => '0.00801';
diff --git a/sources/Catalyst-Plugin-Session/README b/sources/Catalyst-Plugin-Session/README
index c563395..4e48ad0 100644
--- a/sources/Catalyst-Plugin-Session/README
+++ b/sources/Catalyst-Plugin-Session/README
@@ -355,15 +355,25 @@ CONFIGURATION
         The time-to-live of each session, expressed in seconds. Defaults to
         7200 (two hours).
 
+    expiry_threshold
+        Only update the session expiry time if it would otherwise expire
+        within this many seconds from now.
+
+        The purpose of this is to keep the session store from being updated
+        when nothing else in the session is updated.
+
+        Defaults to 0 (in which case, the expiration will always be
+        updated).
+
     verify_address
-        When true, "<$c-"request->address>> will be checked at prepare time.
+        When true, "$c->request->address" will be checked at prepare time.
         If it is not the same as the address that initiated the session, the
         session is deleted.
 
         Defaults to false.
 
     verify_user_agent
-        When true, "<$c-"request->user_agent>> will be checked at prepare
+        When true, "$c->request->user_agent" will be checked at prepare
         time. If it is not the same as the user agent that initiated the
         session, the session is deleted.
 
@@ -457,6 +467,8 @@ AUTHORS
 Contributors
     Devin Austin (dhoss) <dhoss at cpan.org>
 
+    Robert Rothenberg <rrwo at cpan.org> (on behalf of Foxtons Ltd.)
+
 COPYRIGHT & LICENSE
         Copyright (c) 2005 the aforementioned authors. All rights
         reserved. This program is free software; you can redistribute
diff --git a/sources/Catalyst-Plugin-Session/lib/Catalyst/Plugin/Session.pm b/sources/Catalyst-Plugin-Session/lib/Catalyst/Plugin/Session.pm
index 6173146..8733eb8 100644
--- a/sources/Catalyst-Plugin-Session/lib/Catalyst/Plugin/Session.pm
+++ b/sources/Catalyst-Plugin-Session/lib/Catalyst/Plugin/Session.pm
@@ -10,10 +10,11 @@ use Digest              ();
 use overload            ();
 use Object::Signature   ();
 use Carp;
+use List::Util qw/ max /;
 
 use namespace::clean -except => 'meta';
 
-our $VERSION = '0.37';
+our $VERSION = '0.39';
 $VERSION = eval $VERSION;
 
 my @session_data_accessors; # used in delete_session
@@ -80,6 +81,7 @@ sub setup_session {
         expires        => 7200,
         verify_address => 0,
         verify_user_agent => 0,
+        expiry_threshold => 0,
         %$cfg,
     );
 
@@ -136,6 +138,27 @@ sub finalize_session {
     $c->_clear_session_instance_data;
 }
 
+sub _session_updated {
+    my $c = shift;
+
+    if ( my $session_data = $c->_session ) {
+
+        no warnings 'uninitialized';
+        if ( Object::Signature::signature($session_data) ne
+            $c->_session_data_sig )
+        {
+            return $session_data;
+        } else {
+            return;
+        }
+
+    } else {
+
+        return;
+
+    }
+}
+
 sub _save_session_id {
     my $c = shift;
 
@@ -147,26 +170,27 @@ sub _save_session_expires {
     my $c = shift;
 
     if ( defined($c->_session_expires) ) {
-        my $expires = $c->session_expires; # force extension
 
-        my $sid = $c->sessionid;
-        $c->store_session_data( "expires:$sid" => $expires );
+        if (my $sid = $c->sessionid) {
+
+            my $current  = $c->_get_stored_session_expires;
+            my $extended = $c->session_expires;
+            if ($extended > $current) {
+                $c->store_session_data( "expires:$sid" => $extended );
+            }
+
+        }
     }
 }
 
 sub _save_session {
     my $c = shift;
 
-    if ( my $session_data = $c->_session ) {
+    if ( my $session_data = $c->_session_updated ) {
 
-        no warnings 'uninitialized';
-        if ( Object::Signature::signature($session_data) ne
-            $c->_session_data_sig )
-        {
-            $session_data->{__updated} = time();
-            my $sid = $c->sessionid;
-            $c->store_session_data( "session:$sid" => $session_data );
-        }
+        $session_data->{__updated} = time();
+        my $sid = $c->sessionid;
+        $c->store_session_data( "session:$sid" => $session_data );
     }
 }
 
@@ -203,7 +227,7 @@ sub _load_session_expires {
     $c->_tried_loading_session_expires(1);
 
     if ( my $sid = $c->sessionid ) {
-        my $expires = $c->get_session_data("expires:$sid") || 0;
+        my $expires =  $c->_get_stored_session_expires;
 
         if ( $expires >= time() ) {
             $c->_session_expires( $expires );
@@ -361,9 +385,32 @@ sub session_expires {
 
 sub extend_session_expires {
     my ( $c, $expires ) = @_;
-    $c->_extended_session_expires( my $updated = $c->calculate_initial_session_expires( $expires ) );
-    $c->extend_session_id( $c->sessionid, $updated );
-    return $updated;
+
+    my $threshold = $c->_session_plugin_config->{expiry_threshold} || 0;
+
+    if ( my $sid = $c->sessionid ) {
+        my $expires = $c->_get_stored_session_expires;
+        my $cutoff  = $expires - $threshold;
+
+        if (!$threshold || $cutoff <= time || $c->_session_updated) {
+
+            $c->_extended_session_expires( my $updated = $c->calculate_initial_session_expires() );
+            $c->extend_session_id( $sid, $updated );
+
+            return $updated;
+
+        } else {
+
+            return $expires;
+
+        }
+
+    } else {
+
+        return;
+
+    }
+
 }
 
 sub change_session_expires {
@@ -375,20 +422,24 @@ sub change_session_expires {
     $c->store_session_data( "expires:$sid" => $time_exp );
 }
 
+sub _get_stored_session_expires {
+    my ($c) = @_;
+
+    if ( my $sid = $c->sessionid ) {
+        return $c->get_session_data("expires:$sid") || 0;
+    } else {
+        return 0;
+    }
+}
+
 sub initial_session_expires {
     my $c = shift;
     return ( time() + $c->_session_plugin_config->{expires} );
 }
 
 sub calculate_initial_session_expires {
-    my $c = shift;
-
-    my $initial_expires = $c->initial_session_expires;
-    my $stored_session_expires = 0;
-    if ( my $sid = $c->sessionid ) {
-        $stored_session_expires = $c->get_session_data("expires:$sid") || 0;
-    }
-    return ( $initial_expires > $stored_session_expires ) ? $initial_expires : $stored_session_expires;
+    my ($c) = @_;
+    return max( $c->initial_session_expires, $c->_get_stored_session_expires );
 }
 
 sub calculate_extended_session_expires {
@@ -1043,16 +1094,26 @@ C<Plugin::Session> key in the configuration hash.
 The time-to-live of each session, expressed in seconds. Defaults to 7200 (two
 hours).
 
+=item expiry_threshold
+
+Only update the session expiry time if it would otherwise expire
+within this many seconds from now.
+
+The purpose of this is to keep the session store from being updated
+when nothing else in the session is updated.
+
+Defaults to 0 (in which case, the expiration will always be updated).
+
 =item verify_address
 
-When true, C<<$c->request->address>> will be checked at prepare time. If it is
+When true, C<< $c->request->address >> will be checked at prepare time. If it is
 not the same as the address that initiated the session, the session is deleted.
 
 Defaults to false.
 
 =item verify_user_agent
 
-When true, C<<$c->request->user_agent>> will be checked at prepare time. If it
+When true, C<< $c->request->user_agent >> will be checked at prepare time. If it
 is not the same as the user agent that initiated the session, the session is
 deleted.
 
@@ -1177,6 +1238,8 @@ And countless other contributers from #catalyst. Thanks guys!
 
 Devin Austin (dhoss) <dhoss at cpan.org>
 
+Robert Rothenberg <rrwo at cpan.org> (on behalf of Foxtons Ltd.)
+
 =head1 COPYRIGHT & LICENSE
 
     Copyright (c) 2005 the aforementioned authors. All rights
diff --git a/sources/Catalyst-Plugin-Session/t/01_setup.t b/sources/Catalyst-Plugin-Session/t/01_setup.t
index 6ade1d4..a75ea93 100644
--- a/sources/Catalyst-Plugin-Session/t/01_setup.t
+++ b/sources/Catalyst-Plugin-Session/t/01_setup.t
@@ -65,7 +65,7 @@ is( $calls, 0, "no fatal error logged either" );
 
 cmp_deeply(
     [ keys %{ $config{'Plugin::Session'} } ],
-    bag(qw/expires verify_address verify_user_agent/),
+    bag(qw/expires verify_address verify_user_agent expiry_threshold/),
     "default values for config were populated in successful setup",
 );
 
diff --git a/sources/Catalyst-Plugin-Session/t/lib/SessionExpiry.pm b/sources/Catalyst-Plugin-Session/t/lib/SessionExpiry.pm
new file mode 100644
index 0000000..3397a7d
--- /dev/null
+++ b/sources/Catalyst-Plugin-Session/t/lib/SessionExpiry.pm
@@ -0,0 +1,21 @@
+package SessionExpiry;
+use Catalyst
+    qw/Session Session::Store::Dummy Session::State::Cookie Authentication/;
+
+use strict;
+use warnings;
+
+__PACKAGE__->config(
+    'Plugin::Session' => {
+
+        expires          => 20,
+        expiry_threshold => 10,
+
+    },
+
+);
+
+__PACKAGE__->setup;
+
+__PACKAGE__;
+
diff --git a/sources/Catalyst-Plugin-Session/t/lib/SessionExpiry/Controller/Root.pm b/sources/Catalyst-Plugin-Session/t/lib/SessionExpiry/Controller/Root.pm
new file mode 100644
index 0000000..e23cd12
--- /dev/null
+++ b/sources/Catalyst-Plugin-Session/t/lib/SessionExpiry/Controller/Root.pm
@@ -0,0 +1,28 @@
+package SessionExpiry::Controller::Root;
+use strict;
+use warnings;
+
+use base qw/Catalyst::Controller/;
+
+__PACKAGE__->config( namespace => '' );
+
+sub session_data_expires : Global {
+    my ( $self, $c ) = @_;
+    $c->session;
+    if (my $sid = $c->sessionid) {
+        $c->finalize_headers(); # force expiration to be updated
+        $c->res->output($c->get_session_data("expires:$sid"));
+    }
+}
+
+sub session_expires : Global {
+    my ($self, $c) = @_;
+    $c->session;
+    $c->res->output($c->session_expires);
+}
+
+sub update_session : Global {
+    my ($self, $c) = @_;
+    $c->session->{foo} ++;
+    $c->res->output($c->session->{foo});
+}
diff --git a/sources/Catalyst-Plugin-Session/t/lib/SessionTestApp.pm b/sources/Catalyst-Plugin-Session/t/lib/SessionTestApp.pm
index f569aaa..d2a0f77 100644
--- a/sources/Catalyst-Plugin-Session/t/lib/SessionTestApp.pm
+++ b/sources/Catalyst-Plugin-Session/t/lib/SessionTestApp.pm
@@ -10,7 +10,6 @@ __PACKAGE__->config('Plugin::Session' => {
         # needed for live_verify_user_agent.t; should be harmless for other tests
         verify_user_agent => 1,
         verify_address => 1,
-
     },
 
     'Plugin::Authentication' => {
diff --git a/sources/Catalyst-Plugin-Session/t/live_expiry_threshold.t b/sources/Catalyst-Plugin-Session/t/live_expiry_threshold.t
new file mode 100644
index 0000000..75beb64
--- /dev/null
+++ b/sources/Catalyst-Plugin-Session/t/live_expiry_threshold.t
@@ -0,0 +1,81 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+BEGIN {
+    eval { require Catalyst::Plugin::Session::State::Cookie; Catalyst::Plugin::Session::State::Cookie->VERSION(0.03) }
+      or plan skip_all =>
+      "Catalyst::Plugin::Session::State::Cookie 0.03 or higher is required for this test";
+
+    eval {
+        require Test::WWW::Mechanize::Catalyst;
+        Test::WWW::Mechanize::Catalyst->VERSION(0.51);
+    }
+    or plan skip_all =>
+        'Test::WWW::Mechanize::Catalyst >= 0.51 is required for this test';
+}
+
+use lib "t/lib";
+use Test::WWW::Mechanize::Catalyst "SessionExpiry";
+
+my $ua = Test::WWW::Mechanize::Catalyst->new;
+
+my $res = $ua->get( "http://localhost/session_data_expires" );
+ok($res->is_success, "session_data_expires");
+
+my $expiry = $res->decoded_content + 0;
+
+$res = $ua->get( "http://localhost/session_expires" );
+ok($res->is_success, "session_expires");
+is($res->decoded_content, $expiry, "session_expires == session_data_expires");
+
+sleep(1);
+
+$res = $ua->get( "http://localhost/session_data_expires" );
+ok($res->is_success, "session_data_expires");
+
+is($res->decoded_content, $expiry, "expiration not updated");
+
+$res = $ua->get( "http://localhost/session_expires" );
+ok($res->is_success, "session_expires");
+is($res->decoded_content, $expiry, "session_expires == session_data_expires");
+
+#
+
+$res = $ua->get( "http://localhost/update_session" );
+ok($res->is_success, "update_session");
+
+$res = $ua->get( "http://localhost/session_data_expires" );
+ok($res->is_success, "session_data_expires");
+
+my $updated = $res->decoded_content + 0;
+ok($updated > $expiry, "expiration updated");
+
+$expiry = $updated;
+
+$res = $ua->get( "http://localhost/session_data_expires" );
+ok($res->is_success, "session_data_expires");
+
+is($res->decoded_content, $expiry, "expiration not updated");
+
+$res = $ua->get( "http://localhost/session_expires" );
+ok($res->is_success, "session_expires");
+is($res->decoded_content, $expiry, "session_expires == session_data_expires");
+
+sleep(10);
+
+$res = $ua->get( "http://localhost/session_data_expires" );
+ok($res->is_success, "session_data_expires");
+
+$updated = $res->decoded_content + 0;
+ok($updated > $expiry, "expiration updated");
+
+$res = $ua->get( "http://localhost/session_expires" );
+ok($res->is_success, "session_expires");
+is($res->decoded_content, $updated, "session_expires == session_data_expires");
+
+
+done_testing;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libcatalyst-modules-perl.git



More information about the Pkg-perl-cvs-commits mailing list