File Coverage

blib/lib/Squatting/On/PSGI.pm
Criterion Covered Total %
statement 13 15 86.6
branch n/a
condition n/a
subroutine 5 5 100.0
pod n/a
total 18 20 90.0


line stmt bran cond sub pod time code
1             package Squatting::On::PSGI;
2              
3 1     1   6 use strict;
  1         2  
  1         40  
4 1     1   29 use 5.008_001;
  1         3  
  1         52  
5             our $VERSION = '0.06';
6              
7 1     1   2618 use CGI::Cookie;
  1         40558  
  1         35  
8 1     1   718574 use Plack::Request;
  1         346391  
  1         44  
9 1     1   605 use Squatting::H;
  0            
  0            
10              
11             # p for private
12             my %p;
13             $p{init_cc} = sub {
14             my ($c, $env) = @_;
15             my $cc = $c->clone;
16             $cc->env = $env;
17             $cc->cookies = $p{c}->($env->{HTTP_COOKIE} || '');
18             $cc->input = $p{i}->($env);
19             $cc->headers = { 'Content-Type' => 'text/html' };
20             $cc->v = { };
21             $cc->state = $env->{'psgix.session'};
22             $cc->status = 200;
23             $cc;
24             };
25              
26             # \%input = i($env) # Extract CGI parameters from an env object
27             $p{i} = sub {
28             my $r = Plack::Request->new($_[0]);
29             $r->parameters->as_hashref_mixed;
30             };
31              
32             # \%cookies = $p{c}->($cookie_header) # Parse Cookie header(s).
33             $p{c} = sub {
34             +{ map { ref($_) ? $_->value : $_ } CGI::Cookie->parse($_[0]) };
35             };
36              
37             sub psgi {
38             my ($app, $env) = @_;
39              
40             $env->{PATH_INFO} ||= "/";
41             $env->{REQUEST_PATH} ||= do {
42             my $script_name = $env->{SCRIPT_NAME};
43             $script_name =~ s{/$}{};
44             $script_name . $env->{PATH_INFO};
45             };
46             $env->{REQUEST_URI} ||= do {
47             ($env->{QUERY_STRING})
48             ? "$env->{REQUEST_PATH}?$env->{QUERY_STRING}"
49             : $env->{REQUEST_PATH};
50             };
51              
52             my $res;
53             eval {
54             no strict 'refs';
55             my ($c, $args) = &{ $app . "::D" }($env->{REQUEST_PATH});
56             my $cc = $p{init_cc}->($c, $env);
57             my $content = $app->service($cc, @$args);
58              
59             $res = [ $cc->status, [ %{ $cc->{headers} } ], [$content], ];
60             };
61              
62             if ($@) {
63             $res = [ 500, [ 'Content-Type' => 'text/plain' ], ["
$@
"] ];
64             }
65              
66             return $res;
67             }
68              
69             1;
70              
71             __END__