X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Plugin-Session-State-Cookie.git;a=blobdiff_plain;f=FastMmap.pm;h=698063959a6630adb02721aeff8fc94769d8e3d8;hp=e9ae6ceb1e20156830e260c8c5f31399215d12b0;hb=57dbf608ad2080b02fe22ed88dcec44fd997aa4f;hpb=617a86d64440ced92e5d0d938440d8eb555c3505 diff --git a/FastMmap.pm b/FastMmap.pm index e9ae6ce..6980639 100644 --- a/FastMmap.pm +++ b/FastMmap.pm @@ -9,7 +9,7 @@ use URI; use URI::Find; use File::Temp 'tempdir'; -our $VERSION = '0.05'; +our $VERSION = '0.13'; __PACKAGE__->mk_classdata('_session'); __PACKAGE__->mk_accessors('sessionid'); @@ -21,46 +21,65 @@ Catalyst::Plugin::Session::FastMmap - FastMmap sessions for Catalyst =head1 SYNOPSIS use Catalyst 'Session::FastMmap'; + + MyApp->config->{session} = { + expires => 3600, + rewrite => 1, + storage => '/tmp/session' + }; $c->session->{foo} = 'bar'; print $c->sessionid; =head1 DESCRIPTION -Fast sessions. +C is a fast session plugin for +Catalyst that uses an mmap'ed file to act as a shared memory +interprocess cache. It is based on C. + =head2 EXTENDED METHODS -=head3 finalize +=over 4 + +=item finalize =cut sub finalize { - my $c = shift; - my $redirect = $c->response->redirect; - $c->response->redirect( $c->uri($redirect) ) if $redirect; + my $c = shift; + if ( $c->config->{session}->{rewrite} ) { + my $redirect = $c->response->redirect; + $c->response->redirect( $c->uri($redirect) ) if $redirect; + } if ( my $sid = $c->sessionid ) { $c->_session->set( $sid, $c->session ); my $set = 1; if ( my $cookie = $c->request->cookies->{session} ) { $set = 0 if $cookie->value eq $sid; } - $c->response->cookies->{session} = { value => $sid } if $set; - my $finder = URI::Find->new( - sub { - my ( $uri, $orig ) = @_; - my $base = $c->request->base; - return $orig unless $orig =~ /^$base/; - return $orig if $uri->path =~ /\/-\//; - return $c->uri($orig); - } - ); - $finder->find( \$c->res->{output} ) if $c->res->output; + if ( $set ) { + $c->response->cookies->{session} = { + value => $sid + }; + } + if ( $c->config->{session}->{rewrite} ) { + my $finder = URI::Find->new( + sub { + my ( $uri, $orig ) = @_; + my $base = $c->request->base; + return $orig unless $orig =~ /^$base/; + return $orig if $uri->path =~ /\/-\//; + return $c->uri($orig); + } + ); + $finder->find( \$c->res->{body} ) if $c->res->body; + } } return $c->NEXT::finalize(@_); } -=head3 prepare_action +=item prepare_action =cut @@ -98,34 +117,37 @@ sub session { } } -=head3 setup +=item setup + +Sets up the session cache file. =cut sub setup { - my $self = shift; - my $cache_root = $self->config->{cache_root} || tempdir; - my $default_expires_in = $self->config->{default_expires_in} - || 60 * 60 * 24; - my $auto_purge_interval = $self->config->{auto_purge_interval} - || 60 * 60 * 24; - my $auto_purge_on_set = $self->config->{auto_purge_on_set} || 1; + my $self = shift; + $self->config->{session}->{storage} ||= '/tmp/session'; + $self->config->{session}->{expires} ||= 60 * 60 * 24; + $self->config->{session}->{rewrite} ||= 0; + $self->_session( Cache::FastMmap->new( - cache_root => $cache_root, - default_expires_in => $default_expires_in, - auto_purge_interval => $auto_purge_interval, - auto_purge_on_set => $auto_purge_on_set + share_file => $self->config->{session}->{storage}, + expire_time => $self->config->{session}->{expires} ) ); + return $self->NEXT::setup(@_); } +=back + =head2 METHODS -=head3 session +=over 4 + +=item session -=head3 uri +=item uri Extends an uri with session id if needed. @@ -145,19 +167,51 @@ sub uri { return $uri; } +=back + +=head2 CONFIG OPTIONS + +=over 4 + +=item rewrite + +If set to a true value sessions are automatically stored in the url; +defaults to false. + +=item storage + +Specifies the file to be used for the sharing of session data; +defaults to C. + +Note that the file will be created with mode 0640, which means that it +will only be writeable by processes running with the same uid as the +process that creates the file. If this may be a problem, for example +if you may try to debug the program as one user and run it as another, +specify a filename like C<< /tmp/session-$> >>, which includes the +UID of the process in the filename. + + +=item expires + +Specifies the session expiry time in seconds; defaults to 86,400, +i.e. one day. + +=back + =head1 SEE ALSO -L. +L, L. =head1 AUTHOR -Sebastian Riedel, C -Marcus Ramberg C +Sebastian Riedel ECE, +Marcus Ramberg ECE, +Andrew Ford ECE =head1 COPYRIGHT -This program is free software, you can redistribute it and/or modify it under -the same terms as Perl itself. +This program is free software, you can redistribute it and/or modify it +under the same terms as Perl itself. =cut