File Coverage

blib/lib/Plack/Middleware/ReverseProxy.pm
Criterion Covered Total %
statement 42 42 100.0
branch 27 30 90.0
condition 6 6 100.0
subroutine 5 5 100.0
pod 1 1 100.0
total 81 84 96.4


line stmt bran cond sub pod time code
1             package Plack::Middleware::ReverseProxy;
2              
3 2     2   43984 use strict;
  2         37  
  2         100  
4 2     2   13 use warnings;
  2         3  
  2         58  
5 2     2   68 use 5.008_001;
  2         9  
  2         93  
6 2     2   1139 use parent qw(Plack::Middleware);
  2         475  
  2         15  
7             our $VERSION = '0.15';
8              
9             sub call {
10 17     17 1 118923 my $self = shift;
11 17         32 my $env = shift;
12              
13             # in apache2 httpd.conf (RequestHeader set X-Forwarded-HTTPS %{HTTPS}s)
14 17 100       157 $env->{HTTPS} = $env->{'HTTP_X_FORWARDED_HTTPS'}
15             if $env->{'HTTP_X_FORWARDED_HTTPS'};
16 17 100 100     81 $env->{HTTPS} = 'ON'
17             if $env->{'HTTP_X_FORWARDED_PROTO'} && $env->{'HTTP_X_FORWARDED_PROTO'} eq 'https'; # Pound
18 17 100 100     196 $env->{'psgi.url_scheme'} = 'https' if $env->{HTTPS} && uc $env->{HTTPS} eq 'ON';
19 17 100       54 my $default_port = $env->{'psgi.url_scheme'} eq 'https' ? 443 : 80;
20              
21              
22             # If we are running as a backend server, the user will always appear
23             # as 127.0.0.1. Select the most recent upstream IP (last in the list)
24 17 100       40 if ( $env->{'HTTP_X_FORWARDED_FOR'} ) {
25 2         14 my ( $ip, ) = $env->{HTTP_X_FORWARDED_FOR} =~ /([^,\s]+)$/;
26 2         7 $env->{REMOTE_ADDR} = $ip;
27             }
28              
29 17 100       57 if ( $env->{HTTP_X_FORWARDED_HOST} ) {
    50          
30              
31             # in apache1 ServerName example.com:443
32 8 100       27 if ( $env->{HTTP_X_FORWARDED_SERVER} ) {
33 2         13 my ( $host, ) = $env->{HTTP_X_FORWARDED_SERVER} =~ /([^,\s]+)$/;
34 2 100       10 if ( $host =~ /^(.+):(\d+)$/ ) {
35             # $host = $1;
36 1         4 $env->{SERVER_PORT} = $2;
37 1 50       7 $env->{'psgi.url_scheme'} = 'https' if $env->{SERVER_PORT} == 443;
38             }
39 2         6 $env->{HTTP_HOST} = $host;
40             }
41              
42 8         53 my ( $host, ) = $env->{HTTP_X_FORWARDED_HOST} =~ /([^,\s]+)$/;
43 8 100       42 if ( $host =~ /^(.+):(\d+)$/ ) {
    100          
44             # $host = $1;
45 2         6 $env->{SERVER_PORT} = $2;
46             } elsif ( $env->{HTTP_X_FORWARDED_PORT} ) {
47             # in apache2 httpd.conf (RequestHeader set X-Forwarded-Port 8443)
48 2         6 $env->{SERVER_PORT} = $env->{HTTP_X_FORWARDED_PORT};
49 2         8 $host .= ":$env->{SERVER_PORT}";
50 2 100       10 $env->{'psgi.url_scheme'} = 'https'
51             if $env->{SERVER_PORT} == 443;
52             } else {
53 4         10 $env->{SERVER_PORT} = $default_port;
54             }
55 8         17 $env->{HTTP_HOST} = $host;
56              
57             } elsif ( $env->{HTTP_HOST} ) {
58 9         116 my $host = $env->{HTTP_HOST};
59 9 100       58 if ($host =~ /^(.+):(\d+)$/ ) {
    50          
60             # $env->{HTTP_HOST} = $1;
61 1         3 $env->{SERVER_PORT} = $2;
62             } elsif ($host =~ /^(.+)$/ ) {
63 8         21 $env->{HTTP_HOST} = $1;
64 8         20 $env->{SERVER_PORT} = $default_port;
65             }
66             }
67              
68 17         123 $self->app->($env);
69             }
70              
71             1;
72              
73             __END__