| #!/usr/bin/perl | |
| # (C) Maxim Dounin | |
| # Tests for http proxy module related to use with the "if" directive. | |
| # See http://wiki.nginx.org/IfIsEvil for more details. | |
| ############################################################################### | |
| use warnings; | |
| use strict; | |
| use Test::More; | |
| BEGIN { use FindBin; chdir($FindBin::Bin); } | |
| use lib 'lib'; | |
| use Test::Nginx; | |
| ############################################################################### | |
| select STDERR; $| = 1; | |
| select STDOUT; $| = 1; | |
| my $t = Test::Nginx->new()->has(qw/http proxy rewrite http_ssl/) | |
| ->has_daemon('openssl')->plan(15); | |
| $t->write_file_expand('nginx.conf', <<'EOF')->todo_alerts(); | |
| %%TEST_GLOBALS%% | |
| daemon off; | |
| events { | |
| } | |
| http { | |
| %%TEST_GLOBALS_HTTP%% | |
| server { | |
| listen 127.0.0.1:8080; | |
| server_name localhost; | |
| location / { | |
| proxy_pass http://127.0.0.1:8081/; | |
| } | |
| # request was sent to backend without uri changed | |
| # to '/' due to if | |
| location /proxy-pass-uri { | |
| proxy_pass http://127.0.0.1:8081/replacement; | |
| if ($arg_if) { | |
| # nothing | |
| } | |
| location /proxy-pass-uri/inner { | |
| # no proxy_pass here, static | |
| if ($arg_if) { | |
| # nothing | |
| } | |
| } | |
| } | |
| # same as the above, but there is a special handling | |
| # in configuration merge; it used to do wrong things with | |
| # nested locations though | |
| location /proxy-pass-uri-lmt { | |
| proxy_pass http://127.0.0.1:8081/replacement; | |
| limit_except POST { | |
| # nothing | |
| } | |
| location /proxy-pass-uri-lmt/inner { | |
| # no proxy_pass here, static | |
| limit_except POST { | |
| # nothing | |
| } | |
| } | |
| } | |
| location /proxy-pass-uri-lmt-different { | |
| proxy_pass http://127.0.0.1:8081/replacement; | |
| limit_except POST { | |
| proxy_pass http://127.0.0.1:8081; | |
| } | |
| } | |
| # segmentation fault in old versions, | |
| # fixed to return 500 Internal Error in nginx 1.3.10 | |
| location /proxy-inside-if-crash { | |
| set $true 1; | |
| if ($true) { | |
| # proxy_pass inside if | |
| proxy_pass http://127.0.0.1:8081; | |
| } | |
| if ($true) { | |
| # no handler here | |
| } | |
| } | |
| # normal proxy_pass and proxy_pass with variables | |
| # use distinct field, and inheritance should be mutually | |
| # exclusive | |
| location /variables { | |
| proxy_pass http://127.0.0.1:8081/outer/$host; | |
| if ($arg_if) { | |
| proxy_pass http://127.0.0.1:8081; | |
| } | |
| location /variables/inner { | |
| proxy_pass http://127.0.0.1:8081; | |
| } | |
| } | |
| # ssl context shouldn't be inherited into nested | |
| # locations with different proxy_pass, but should | |
| # be correctly inherited into if's | |
| location /ssl { | |
| proxy_pass https://127.0.0.1:8082/outer; | |
| if ($arg_if) { | |
| # inherited from outer | |
| } | |
| location /ssl/inner { | |
| proxy_pass http://127.0.0.1:8081; | |
| } | |
| } | |
| } | |
| server { | |
| listen 127.0.0.1:8081; | |
| listen 127.0.0.1:8082 ssl; | |
| server_name localhost; | |
| ssl_certificate localhost.crt; | |
| ssl_certificate_key localhost.key; | |
| return 200 "uri:$uri\n"; | |
| } | |
| } | |
| EOF | |
| $t->write_file('openssl.conf', <<EOF); | |
| [ req ] | |
| default_bits = 1024 | |
| encrypt_key = no | |
| distinguished_name = req_distinguished_name | |
| [ req_distinguished_name ] | |
| EOF | |
| my $d = $t->testdir(); | |
| foreach my $name ('localhost') { | |
| system('openssl req -x509 -new ' | |
| . "-config $d/openssl.conf -subj /CN=$name/ " | |
| . "-out $d/$name.crt -keyout $d/$name.key " | |
| . ">>$d/openssl.out 2>&1") == 0 | |
| or die "Can't create certificate for $name: $!\n"; | |
| } | |
| $t->run(); | |
| ############################################################################### | |
| like(http_get('/'), qr!uri:/$!, 'proxy request'); | |
| like(http_get('/proxy-pass-uri'), qr!uri:/replacement$!, | |
| 'proxy_pass uri changed'); | |
| # due to missing information about an original location where | |
| # proxy_pass was specified, this used to pass request with | |
| # original unmodified uri | |
| like(http_get('/proxy-pass-uri?if=1'), qr!uri:/replacement$!, | |
| 'proxy_pass uri changed in if'); | |
| like(http_get('/proxy-pass-uri/inner'), qr!404 Not Found!, | |
| 'proxy_pass uri changed inner'); | |
| like(http_get('/proxy-pass-uri/inner?if=1'), qr!404 Not Found!, | |
| 'proxy_pass uri changed inner in if'); | |
| # limit_except | |
| like(http_get('/proxy-pass-uri-lmt'), qr!uri:/replacement$!, | |
| 'proxy_pass uri and limit_except'); | |
| # special handling of limit_except resulted in wrong handling | |
| # of requests in nested locations | |
| like(http_get('/proxy-pass-uri-lmt/inner'), qr!404 Not Found!, | |
| 'proxy_pass uri and limit_except, inner'); | |
| like(http_get('/proxy-pass-uri-lmt-different'), | |
| qr!uri:/proxy-pass-uri-lmt-different!, | |
| 'proxy_pass and limit_except with different proxy_pass'); | |
| # segmentation fault in old versions, | |
| # fixed to return 500 Internal Error in nginx 1.3.10 | |
| like(http_get('/proxy-inside-if-crash'), qr!500 Internal Server Error!, | |
| 'proxy_pass inside if'); | |
| # normal proxy_pass and proxy_pass with variables | |
| # use distinct field, and inheritance should be mutually | |
| # exclusive, see ticket #645 | |
| like(http_get('/variables'), qr!uri:/outer!, | |
| 'proxy_pass variables'); | |
| like(http_get('/variables?if=1'), qr!uri:/variables!, | |
| 'proxy_pass variables if'); | |
| like(http_get('/variables/inner'), qr!uri:/variables/inner!, | |
| 'proxy_pass variables nested'); | |
| # ssl context shouldn't be inherited into nested | |
| # locations with different proxy_pass, but should | |
| # be correctly inherited into if's | |
| like(http_get('/ssl'), qr!uri:/outer!, | |
| 'proxy_pass ssl'); | |
| like(http_get('/ssl?if=1'), qr!uri:/outer!, | |
| 'proxy_pass ssl inside if'); | |
| like(http_get('/ssl/inner'), qr!uri:/ssl/inner!, | |
| 'proxy_pass nossl inside ssl'); | |
| ############################################################################### |