| use strict; |
| use warnings FATAL => 'all'; |
| |
| use Apache::Test; |
| use Apache::TestRequest; |
| use Apache::TestUtil; |
| use Apache::TestCommon (); |
| |
| my %frontend = ( |
| proxy_http_https => 'http', |
| proxy_https_https => 'https', |
| proxy_https_http => 'https', |
| proxy_http_https_proxy_section => 'http', |
| proxy_https_https_proxy_section => 'https', |
| ); |
| my %backend = ( |
| proxy_http_https => 'https', |
| proxy_https_https => 'https', |
| proxy_https_http => 'http', |
| proxy_http_https_proxy_section => 'https', |
| proxy_https_https_proxy_section => 'https', |
| ); |
| |
| my $num_modules = scalar keys %frontend; |
| my $post_module = 'eat_post'; |
| |
| my $post_tests = have_module($post_module) ? |
| Apache::TestCommon::run_post_test_sizes() : 0; |
| |
| my $num_http_backends = 0; |
| for my $module (sort keys %backend) { |
| if ($backend{$module} eq "http") { |
| $num_http_backends++; |
| } |
| } |
| |
| plan tests => (8 + $post_tests) * $num_modules - 5 * $num_http_backends, |
| need need_lwp, [qw(mod_proxy proxy_http.c)]; |
| |
| for my $module (sort keys %frontend) { |
| |
| my $scheme = $frontend{$module}; |
| Apache::TestRequest::module($module); |
| Apache::TestRequest::scheme($scheme); |
| |
| my $hostport = Apache::TestRequest::hostport(); |
| my $res; |
| my %vars; |
| |
| sok { |
| t_cmp(GET('/')->code, |
| 200, |
| "/ with $module ($scheme)"); |
| }; |
| |
| sok { |
| t_cmp(GET('/modules/cgi/nph-foldhdr.pl')->code, |
| 200, |
| "CGI script with folded headers"); |
| }; |
| |
| if ($backend{$module} eq "https") { |
| sok { |
| t_cmp(GET('/verify')->code, |
| 200, |
| "using valid proxyssl client cert"); |
| }; |
| |
| sok { |
| t_cmp(GET('/require/snakeoil')->code, |
| 403, |
| "using invalid proxyssl client cert"); |
| }; |
| |
| $res = GET('/require-ssl-cgi/env.pl'); |
| |
| sok { |
| t_cmp($res->code, 200, "protected cgi script"); |
| }; |
| |
| my $body = $res->content || ""; |
| |
| for my $line (split /\s*\r?\n/, $body) { |
| my($key, $val) = split /\s*=\s*/, $line, 2; |
| next unless $key; |
| $vars{$key} = $val || ""; |
| } |
| |
| sok { |
| t_cmp($vars{HTTP_X_FORWARDED_HOST}, |
| $hostport, |
| "X-Forwarded-Host header"); |
| }; |
| |
| sok { |
| t_cmp($vars{SSL_CLIENT_S_DN_CN}, |
| 'client_ok', |
| "client subject common name"); |
| }; |
| } |
| |
| sok { |
| #test that ProxyPassReverse rewrote the Location header |
| #to use the frontend server rather than downstream server |
| my $uri = '/modules'; |
| my $ruri = Apache::TestRequest::resolve_url($uri) . '/'; |
| |
| #tell lwp not to follow redirect so we can see the Location header |
| local $Apache::TestRequest::RedirectOK = 0; |
| |
| $res = GET($uri); |
| |
| my $location = $res->header('Location') || 'NONE'; |
| |
| t_cmp($location, $ruri, 'ProxyPassReverse Location rewrite'); |
| }; |
| |
| Apache::TestCommon::run_post_test($post_module) if $post_tests; |
| Apache::TestRequest::user_agent(reset => 1); |
| } |