CGI-Application-Plugin-Cache-Adaptive
view release on metacpan or search on metacpan
inc/CGI/Application/Plugin/Session.pm view on Meta::CPAN
}
sub session_cookie {
my $self = shift;
my %options = @_;
# merge in any parameters set by config_session
if ($self->{__CAP__SESSION_CONFIG}->{COOKIE_PARAMS}) {
%options = (%{ $self->{__CAP__SESSION_CONFIG}->{COOKIE_PARAMS} }, %options);
}
if (!$self->{__CAP__SESSION_OBJ}) {
# The session object has not been created yet, so make sure we at least call it once
my $tmp = $self->session;
}
$options{'-name'} ||= CGI::Session->name;
$options{'-value'} ||= $self->session->id;
if(defined($self->session->expires()) && !defined($options{'-expires'})) {
$options{'-expires'} = _build_exp_time( $self->session->expires() );
}
my $cookie = $self->query->cookie(%options);
$self->header_add(-cookie => [$cookie]);
}
sub _build_exp_time {
my $secs_until_expiry = shift;
return unless defined $secs_until_expiry;
# Add a plus sign unless the number is negative
my $prefix = ($secs_until_expiry >= 0) ? '+' : '';
# Add an 's' for "seconds".
return $prefix.$secs_until_expiry.'s';
}
sub session_delete {
my $self = shift;
if ( my $session = $self->session ) {
$session->delete;
if ( $self->{'__CAP__SESSION_CONFIG'}->{'SEND_COOKIE'} ) {
my %options;
if ( $self->{'__CAP__SESSION_CONFIG'}->{'COOKIE_PARAMS'} ) {
%options = ( %{ $self->{'__CAP__SESSION_CONFIG'}->{'COOKIE_PARAMS'} }, %options );
}
$options{'name'} ||= CGI::Session->name;
$options{'value'} = '';
$options{'-expires'} = '-1d';
my $newcookie = $self->query->cookie(%options);
# See if a session cookie has already been set (this will happen if
# this is a new session). We keep all existing cookies except the
# session cookie, which we replace with the timed out session
# cookie
my @keep;
my %headers = $self->header_props;
my $cookies = $headers{'-cookie'} || [];
$cookies = [$cookies] unless ref $cookies eq 'ARRAY';
foreach my $cookie (@$cookies) {
if ( ref($cookie) ne 'CGI::Cookie' || $cookie->name ne CGI::Session->name ) {
# keep this cookie
push @keep, $cookie;
}
}
push @keep, $newcookie;
# We have to set the cookies this way, because CGI::Application has
# an annoying interface to the headers (why can't we have
# 'header_set as well as header_add?). The first call replaces all
# cookie headers with the one new cookie header, and the next call
# adds in the rest of the cookies if there are any.
$self->header_add( -cookie => shift @keep );
$self->header_add( -cookie => \@keep ) if @keep;
}
}
}
1;
__END__
#line 439
( run in 0.596 second using v1.01-cache-2.11-cpan-39bf76dae61 )