Changeset 29307
- Timestamp:
- 01/30/09 21:26:18 (4 years ago)
- Location:
- lang/perl/HTTP-Engine-Middleware/branches/declare
- Files:
-
- 2 modified
-
lib/HTTP/Engine/Middleware/ReverseProxy.pm (modified) (1 diff)
-
t/200_middlewares/reverseproxy.t (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/perl/HTTP-Engine-Middleware/branches/declare/lib/HTTP/Engine/Middleware/ReverseProxy.pm
r29266 r29307 1 1 package HTTP::Engine::Middleware::ReverseProxy; 2 use Moose;2 use HTTP::Engine::Middleware; 3 3 4 sub wrap { 5 my ($class, $next) = @_; 4 before_handle { 5 my ( $c, $self, $req ) = @_; 6 my $env = $req->_connection->{env} || {}; 6 7 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'; 9 13 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 } 15 20 16 # If we are running as a backend server, the user will always appear17 # 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; 21 26 } 27 elsif ( $req->headers->{'x-forwarded-port'} ) { 22 28 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; 33 33 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; 37 37 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 ); 43 42 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} || '/'; 53 44 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 3 3 use Test::Base; 4 4 use HTTP::Engine; 5 use HTTP::Engine::Middleware ::ReverseProxy;5 use HTTP::Engine::Middleware; 6 6 use HTTP::Request; 7 7 use HTTP::Headers; … … 20 20 $ENV{QUERY_STRING} = 'foo=bar'; 21 21 22 my $mw = HTTP::Engine::Middleware->new; 23 $mw->install( 'HTTP::Engine::Middleware::ReverseProxy', ); 24 22 25 my $headers = HTTP::Headers->new; 23 $headers->header(%{ $block->input }); 26 $headers->header( %{ $block->input } ); 27 24 28 # $headers->header(HOST => 'example.com:80'); 25 29 HTTP::Engine->new( 26 30 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; 30 35 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 } 34 41 } 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' ); 35 50 } 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 ), 44 52 }, 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 ); 46 57 }; 47 58
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)