use strict;
use warnings;
-our $VERSION = '0.03';
+our $VERSION = '0.09_02';
our $AUTHORITY = 'cpan:STEVAN';
-use Plack::Request;
-use Plack::Response;
use Plack::Util;
use Scalar::Util;
use Plack::Util::Accessor qw(
state
store
- session_class
);
sub prepare_app {
$self->state( 'Cookie' ) unless $self->state;
$self->state( $self->inflate_backend('Plack::Session::State', $self->state) );
$self->store( $self->inflate_backend('Plack::Session::Store', $self->store) );
-
- Plack::Util::load_class($self->session_class) if $self->session_class;
}
sub inflate_backend {
my $self = shift;
my $env = shift;
- my $request = Plack::Request->new($env);
-
- my($id, $session);
- if ($id = $self->state->extract($request) and
- $session = $self->store->fetch($id)) {
+ my($id, $session) = $self->get_session($env);
+ if ($id && $session) {
$env->{'psgix.session'} = $session;
} else {
- $id = $self->state->generate($request);
+ $id = $self->generate_id($env);
$env->{'psgix.session'} = {};
}
$env->{'psgix.session.options'} = { id => $id };
- if ($self->session_class) {
- $env->{'plack.session'} = $self->session_class->new(
- manager => $self,
- _data => $env->{'psgix.session'},
- options => $env->{'psgix.session.options'},
- );
- }
-
my $res = $self->app->($env);
- $self->response_cb($res, sub {
- my $res = Plack::Response->new(@{$_[0]});
- $self->finalize($env->{'psgix.session'}, $env->{'psgix.session.options'}, $res);
- $res = $res->finalize;
- $_[0]->[0] = $res->[0];
- $_[0]->[1] = $res->[1];
- });
+ $self->response_cb($res, sub { $self->finalize($env, $_[0]) });
+}
+
+sub get_session {
+ my($self, $env) = @_;
+
+ my $id = $self->state->extract($env) or return;
+ my $session = $self->store->fetch($id) or return;
+
+ return ($id, $session);
+}
+
+sub generate_id {
+ my($self, $env) = @_;
+ $self->state->generate($env);
}
sub commit {
- my($self, $session, $options) = @_;
+ my($self, $env) = @_;
+
+ my $session = $env->{'psgix.session'};
+ my $options = $env->{'psgix.session.options'};
+
if ($options->{expire}) {
- $self->store->cleanup($options->{id});
+ $self->store->remove($options->{id});
} else {
$self->store->store($options->{id}, $session);
}
}
sub finalize {
- my($self, $session, $options, $response) = @_;
+ my($self, $env, $res) = @_;
+
+ my $session = $env->{'psgix.session'};
+ my $options = $env->{'psgix.session.options'};
- $self->commit($session, $options);
+ $self->commit($env) unless $options->{no_store};
if ($options->{expire}) {
- $self->state->expire_session_id($options->{id}, $response);
+ $self->expire_session($options->{id}, $res, $env);
} else {
- $self->state->finalize($options->{id}, $response, $options);
+ $self->save_state($options->{id}, $res, $env);
}
}
+sub expire_session {
+ my($self, $id, $res, $env) = @_;
+ $self->state->expire_session_id($id, $res, $env->{'psgix.session.options'});
+}
+
+sub save_state {
+ my($self, $id, $res, $env) = @_;
+ $self->state->finalize($id, $res, $env->{'psgix.session.options'});
+}
+
1;
__END__
B<NOTE:> As of version 0.04 the session is stored in C<psgix.session>
instead of C<plack.session>.
-Also, if you set I<session_class> option (see below), we create a
-session object out of the hash reference in C<plack.session>.
-
=head2 State
=over 4
more robust solution see L<Plack::Session::Store::File> or
L<Plack::Session::Store::Cache>.
-=item I<session_class>
-
-This can be used to create an actual session object in
-C<plack.session> environment. Defaults to none, which means the
-session object is not created but you can set C<Plack::Session> to
-create an object for you.
-
=back
=head1 BUGS