File Coverage

blib/lib/Plack/Middleware/Auth/FCGI.pm
Criterion Covered Total %
statement 12 45 26.6
branch 0 14 0.0
condition 0 11 0.0
subroutine 4 6 66.6
pod 2 2 100.0
total 18 78 23.0


line stmt bran cond sub pod time code
1             package Plack::Middleware::Auth::FCGI;
2              
3 1     1   56517 use strict;
  1         2  
  1         37  
4              
5             our $VERSION = '0.02';
6              
7 1     1   5 use base qw(Plack::Middleware);
  1         1  
  1         484  
8 1     1   13162 use Plack::Util;
  1         1  
  1         20  
9 1         3 use Plack::Util::Accessor qw(
10             on_reject
11             host
12             port
13             fcgi_auth_params
14 1     1   5 );
  1         9  
15              
16             sub prepare_app {
17 0     0 1   my ($self) = @_;
18 0           Plack::Util::load_class('FCGI::Client');
19             }
20              
21             sub call {
22 0     0 1   my ( $self, $env ) = @_;
23 0 0         my $sock = IO::Socket::INET->new(
24             PeerAddr => $self->host,
25             PeerPort => $self->port,
26             ) or die $!;
27             $env->{$_} = $self->fcgi_auth_params->{$_}
28 0           foreach ( keys %{ $self->fcgi_auth_params } );
  0            
29 0           my $client = FCGI::Client::Connection->new( sock => $sock );
30 0           my ( $stdout, $stderr ) = $client->request($env);
31 0           my $rejApp = $self->on_reject;
32 0           my @lines = split /\r?\n/, $stdout;
33 0           my %hdrs;
34              
35 0           foreach (@lines) {
36 0 0         if (/^(.*?): (.*)$/) {
37 0           my ( $k, $v ) = ( lc($1), $2 );
38 0 0         if ( $hdrs{$k} ) {
39 0           $hdrs{$k} = $hdrs{$k} . ",$v";
40             }
41             else {
42 0           $hdrs{$k} = $v;
43             }
44             }
45             }
46 0           my $code;
47 0 0         if ( $hdrs{status} =~ /^(\d+)\s+(.*)$/ ) {
48 0           $code = $1;
49             }
50             else {
51 0   0       $hdrs{status} ||= '500 Server Error';
52 0           $code = 500;
53             }
54 0 0 0       if ( $hdrs{location} and $code == 302 or $code == 303 or $code == 401 ) {
      0        
      0        
55 0           return [ 302, [ Location => $hdrs{location} ], [] ];
56             }
57 0 0         unless ( $code < 300 ) {
58 0 0         if ($rejApp) {
59 0           return $self->$rejApp( $env, \%hdrs );
60             }
61             else {
62 0           return [ $code, [%hdrs], [ $hdrs{status} ] ];
63             }
64             }
65 0           my $app = $self->app;
66 0           foreach ( keys %hdrs ) {
67 0           $env->{$_} = 'fcgiauth-' . $hdrs{$_} foreach ( keys %hdrs );
68             }
69 0           @_ = $env;
70 0           goto $app;
71             }
72              
73             1;
74             __END__