File Coverage

blib/lib/HTTP/Session/State/Cookie.pm
Criterion Covered Total %
statement 47 48 97.9
branch 18 20 90.0
condition 7 7 100.0
subroutine 10 10 100.0
pod 4 4 100.0
total 86 89 96.6


line stmt bran cond sub pod time code
1             package HTTP::Session::State::Cookie;
2 4     4   1571 use strict;
  4         9  
  4         104  
3 4     4   1355 use HTTP::Session::State::Base;
  4         9  
  4         20  
4 4     4   761 use Carp ();
  4         9  
  4         56  
5 4     4   14 use Scalar::Util ();
  4         8  
  4         2133  
6              
7             our $COOKIE_CLASS = 'CGI::Cookie';
8              
9             __PACKAGE__->mk_accessors(qw/name path domain expires secure/);
10              
11             {
12             my $required = 0;
13             sub _cookie_class {
14 29     29   35 my $class = shift;
15 29 100       79 unless ($required) {
16 4         22 (my $klass = $COOKIE_CLASS) =~ s!::!/!g;
17 4         11 $klass .= ".pm";
18 4         1794 require $klass;
19 4         12149 $required++;
20             }
21 29         119 return $COOKIE_CLASS
22             }
23             }
24              
25             sub new {
26 20     20 1 490 my $class = shift;
27 20 50       66 my %args = ref($_[0]) ? %{$_[0]} : @_;
  0         0  
28             # set default values
29 20   100     86 $args{name} ||= 'http_session_sid';
30 20   100     138 $args{path} ||= '/';
31 20         161 bless {%args}, $class;
32             }
33              
34             sub get_session_id {
35 20     20 1 430 my ($self, $req) = @_;
36              
37 20   100     97 my $cookie_header = $ENV{HTTP_COOKIE} || (Scalar::Util::blessed($req) ? $req->header('Cookie') : $req->{HTTP_COOKIE});
38 20 100       546 return unless $cookie_header;
39              
40 18         39 my %jar = _cookie_class()->parse($cookie_header);
41 18         5474 my $cookie = $jar{$self->name};
42 18 100       134 return $cookie ? $cookie->value : undef;
43             }
44              
45             sub response_filter {
46 11     11 1 236 my ($self, $session_id, $res) = @_;
47 11 100       356 Carp::croak "missing session_id" unless $session_id;
48              
49 9         19 $self->header_filter($session_id, $res);
50             }
51              
52             sub header_filter {
53 11     11 1 54 my ($self, $session_id, $res) = @_;
54 11 50       19 Carp::croak "missing session_id" unless $session_id;
55              
56             my $cookie = _cookie_class()->new(
57             sub {
58 11     11   163 my %options = (
59             -name => $self->name,
60             -value => $session_id,
61             -path => $self->path,
62             );
63 11 100       390 $options{'-domain'} = $self->domain if $self->domain;
64 11 100       251 $options{'-expires'} = $self->expires if $self->expires;
65 11 100       245 $options{'-secure'} = $self->secure if $self->secure;
66 11         123 %options;
67 11         21 }->()
68             );
69 11 100       1701 if (Scalar::Util::blessed($res)) {
70 10         23 $res->header( 'Set-Cookie' => $cookie->as_string );
71 10         1409 $res;
72             } else {
73 1         2 push @{$res->[1]}, 'Set-Cookie' => $cookie->as_string;
  1         4  
74 1         80 $res;
75             }
76             }
77              
78             1;
79             __END__