Changeset 29307

Show
Ignore:
Timestamp:
01/30/09 21:26:18 (4 years ago)
Author:
dann
Message:

changed implementation based on new HTTP::Engine::Middleware interface

Location:
lang/perl/HTTP-Engine-Middleware/branches/declare
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/HTTP-Engine-Middleware/branches/declare/lib/HTTP/Engine/Middleware/ReverseProxy.pm

    r29266 r29307  
    11package HTTP::Engine::Middleware::ReverseProxy; 
    2 use Moose; 
     2use HTTP::Engine::Middleware; 
    33 
    4 sub wrap { 
    5     my ($class, $next) = @_; 
     4before_handle { 
     5    my ( $c, $self, $req ) = @_; 
     6    my $env = $req->_connection->{env} || {}; 
    67 
    7     sub { 
    8         my $req = shift; 
     8    # in apache httpd.conf (RequestHeader set X-Forwarded-HTTPS %{HTTPS}s) 
     9    $env->{HTTPS} = $req->headers->{'x-forwarded-https'} 
     10        if $req->headers->{'x-forwarded-https'}; 
     11    $env->{HTTPS} = 'ON' if $req->headers->{'x-forwarded-proto'};    # Pound 
     12    $req->secure(1) if $env->{HTTPS} && uc $env->{HTTPS} eq 'ON'; 
    913 
    10         my $env = $req->_connection->{env} || {}; 
    11         # in apache httpd.conf (RequestHeader set X-Forwarded-HTTPS %{HTTPS}s) 
    12         $env->{HTTPS} = $req->headers->{'x-forwarded-https'} if $req->headers->{'x-forwarded-https'}; 
    13         $env->{HTTPS} = 'ON'                         if $req->headers->{'x-forwarded-proto'}; # Pound 
    14         $req->secure(1) if $env->{HTTPS} && uc $env->{HTTPS} eq 'ON'; 
     14    # If we are running as a backend server, the user will always appear 
     15    # as 127.0.0.1. Select the most recent upstream IP (last in the list) 
     16    if ( $req->headers->{'x-forwarded-for'} ) { 
     17        my ( $ip, ) = $req->headers->{'x-forwarded-for'} =~ /([^,\s]+)$/; 
     18        $req->address($ip); 
     19    } 
    1520 
    16         # If we are running as a backend server, the user will always appear 
    17         # as 127.0.0.1. Select the most recent upstream IP (last in the list) 
    18         if ($req->headers->{'x-forwarded-for'}) { 
    19             my ($ip, ) = $req->headers->{'x-forwarded-for'} =~ /([^,\s]+)$/; 
    20             $req->address($ip); 
     21    if ( $req->headers->{'x-forwarded-host'} ) { 
     22        my $host = $req->headers->{'x-forwarded-host'}; 
     23        if ( $host =~ /^(.+):(\d+)$/ ) { 
     24            $host = $1; 
     25            $env->{SERVER_PORT} = $2; 
    2126        } 
     27        elsif ( $req->headers->{'x-forwarded-port'} ) { 
    2228 
    23         if ($req->headers->{'x-forwarded-host'}) { 
    24             my $host = $req->headers->{'x-forwarded-host'}; 
    25             if ($host =~ /^(.+):(\d+)$/ ) { 
    26                 $host = $1; 
    27                 $env->{SERVER_PORT} = $2; 
    28             } elsif ($req->headers->{'x-forwarded-port'}) { 
    29                 # in apache httpd.conf (RequestHeader set X-Forwarded-Port 8443) 
    30                 $env->{SERVER_PORT} = $req->headers->{'x-forwarded-port'}; 
    31             } 
    32             $env->{HTTP_HOST} = $host; 
     29            # in apache httpd.conf (RequestHeader set X-Forwarded-Port 8443) 
     30            $env->{SERVER_PORT} = $req->headers->{'x-forwarded-port'}; 
     31        } 
     32        $env->{HTTP_HOST} = $host; 
    3333 
    34             $req->headers->header( 'Host' => $env->{HTTP_HOST} ); 
    35         } 
    36         $req->_connection->{env} = $env; 
     34        $req->headers->header( 'Host' => $env->{HTTP_HOST} ); 
     35    } 
     36    $req->_connection->{env} = $env; 
    3737 
    38         for my $attr (qw/uri base/) { 
    39             my $scheme = $req->secure ? 'https' : 'http'; 
    40             my $host = $env->{HTTP_HOST} || $env->{SERVER_NAME}; 
    41             my $port = $env->{SERVER_PORT} || ( $req->secure ? 443 : 80 ); 
    42             # my $path_info = $env->{PATH_INFO} || '/'; 
     38    for my $attr (qw/uri base/) { 
     39        my $scheme = $req->secure ? 'https' : 'http'; 
     40        my $host = $env->{HTTP_HOST} || $env->{SERVER_NAME}; 
     41        my $port = $env->{SERVER_PORT} || ( $req->secure ? 443 : 80 ); 
    4342 
    44             $req->$attr->scheme($scheme); 
    45             $req->$attr->host($host); 
    46             $req->$attr->port($port); 
    47             # $req->$attr->path($path_info); 
    48             # $req->$attr( $req->$attr->canonical ); 
    49         } 
    50         $next->($req); 
    51     }; 
    52 } 
     43        # my $path_info = $env->{PATH_INFO} || '/'; 
    5344 
    54 1; 
     45        $req->$attr->scheme($scheme); 
     46        $req->$attr->host($host); 
     47        $req->$attr->port($port); 
     48 
     49        # $req->$attr->path($path_info); 
     50        # $req->$attr( $req->$attr->canonical ); 
     51    } 
     52    $req; 
     53}; 
     54 
     55__MIDDLEWARE__ 
     56 
     57__END__ 
     58 
  • lang/perl/HTTP-Engine-Middleware/branches/declare/t/200_middlewares/reverseproxy.t

    r29273 r29307  
    33use Test::Base; 
    44use HTTP::Engine; 
    5 use HTTP::Engine::Middleware::ReverseProxy; 
     5use HTTP::Engine::Middleware; 
    66use HTTP::Request; 
    77use HTTP::Headers; 
     
    2020    $ENV{QUERY_STRING}   = 'foo=bar'; 
    2121 
     22    my $mw = HTTP::Engine::Middleware->new; 
     23    $mw->install( 'HTTP::Engine::Middleware::ReverseProxy', ); 
     24 
    2225    my $headers = HTTP::Headers->new; 
    23     $headers->header(%{ $block->input }); 
     26    $headers->header( %{ $block->input } ); 
     27 
    2428    # $headers->header(HOST => 'example.com:80'); 
    2529    HTTP::Engine->new( 
    2630        interface => { 
    27             module => 'Test', 
    28             request_handler => HTTP::Engine::Middleware::ReverseProxy->wrap(sub { 
    29                 my $req = shift; 
     31            module          => 'Test', 
     32            request_handler => $mw->handler( 
     33                sub { 
     34                    my $req = shift; 
    3035 
    31                 for my $attr ( qw/secure address/ ) { 
    32                     if ( $block->$attr ) { 
    33                       is($req->$attr, $block->$attr, $block->name . " of $attr"); 
     36                    for my $attr (qw/secure address/) { 
     37                        if ( $block->$attr ) { 
     38                            is( $req->$attr, $block->$attr, 
     39                                $block->name . " of $attr" ); 
     40                        } 
    3441                    } 
     42                    for my $url (qw/uri base /) { 
     43                        if ( $block->$url ) { 
     44                            is( $req->$url->as_string, $block->$url, 
     45                                $block->name . " of $url" ); 
     46                        } 
     47                    } 
     48 
     49                    HTTP::Engine::Response->new( body => 'OK' ); 
    3550                } 
    36                 for my $url ( qw/uri base / ) { 
    37                   if ( $block->$url ) { 
    38                     is($req->$url->as_string, $block->$url, $block->name . " of $url"); 
    39                   } 
    40                 } 
    41  
    42                 HTTP::Engine::Response->new(body  => 'OK'); 
    43             }), 
     51            ), 
    4452        }, 
    45     )->run(HTTP::Request->new(GET => 'http://example.com/?foo=bar', $headers),env => \%ENV); 
     53        )->run( 
     54        HTTP::Request->new( GET => 'http://example.com/?foo=bar', $headers ), 
     55        env => \%ENV 
     56        ); 
    4657}; 
    4758