blob: ce947f027e480a080e0b50a5489d80ce57443925 [file] [log] [blame]
#!/usr/bin/perl
# (C) Maxim Dounin
# Tests for error_page directive.
###############################################################################
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/)->plan(9)
->write_file_expand('nginx.conf', <<'EOF');
%%TEST_GLOBALS%%
daemon off;
events {
}
http {
%%TEST_GLOBALS_HTTP%%
server {
listen 127.0.0.1:8080;
server_name localhost;
location /redirect200 {
error_page 404 =200 http://example.com/;
return 404;
}
location /redirect497 {
# 497 implies implicit status code change
error_page 497 https://example.com/;
return 497;
}
location /error302redirect {
error_page 302 http://example.com/;
return 302 "first";
}
location /error302return302text {
error_page 302 /return302text;
return 302 "first";
}
location /return302text {
return 302 "http://example.com/";
}
location /error302return302args {
error_page 302 /return302args?1;
return 302 "first";
}
location /error302return302varargs {
error_page 302 /return302args?$arg_a;
return 302 "first";
}
location /return302args {
return 302 "http://example.com/$args";
}
location /error302rewrite {
error_page 302 /rewrite;
return 302 "first";
}
location /rewrite {
rewrite ^ http://example.com/;
}
location /error302directory {
error_page 302 /directory;
return 302 "first";
}
location /directory {
}
location /error302auto {
error_page 302 /auto;
return 302 "first";
}
location /auto/ {
proxy_pass http://127.0.0.1:8081;
}
}
}
EOF
mkdir($t->testdir() . '/directory');
$t->run();
###############################################################################
# tests for error_page status code change for redirects. problems
# introduced in 0.8.53 and fixed in 0.9.5.
like(http_get('/redirect200'), qr!HTTP!, 'redirect 200');
like(http_get('/redirect497'), qr!HTTP/1.1 302!, 'redirect 497');
# various tests to see if old location cleared if we happen to redirect
# again in error_page 302
like(http_get('/error302redirect'),
qr{HTTP/1.1 302(?!.*Location: first).*Location: http://example.com/}ms,
'error 302 redirect - old location cleared');
like(http_get('/error302return302text'),
qr{HTTP/1.1 302(?!.*Location: first).*Location: http://example.com/}ms,
'error 302 return 302 text - old location cleared');
like(http_get('/error302return302args'),
qr{HTTP/1.1 302(?!.*Location: first).*Location: http://example.com/1}ms,
'error 302 return 302 args - old location cleared');
like(http_get('/error302return302varargs?a=2'),
qr{HTTP/1.1 302(?!.*Location: first).*Location: http://example.com/2}ms,
'error 302 return 302 var args - old location cleared');
like(http_get('/error302rewrite'),
qr{HTTP/1.1 302(?!.*Location: first).*Location: http://example.com/}ms,
'error 302 rewrite - old location cleared');
like(http_get('/error302directory'),
qr{HTTP/1.1 301(?!.*Location: first).*Location: http://}ms,
'error 302 directory redirect - old location cleared');
like(http_get('/error302auto'),
qr{HTTP/1.1 301(?!.*Location: first).*Location: http://}ms,
'error 302 auto redirect - old location cleared');
###############################################################################