#!/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 rewrite/)->plan(7)
	->write_file_expand('nginx.conf', <<'EOF');

%%TEST_GLOBALS%%

master_process off;
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 /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');

TODO: {
local $TODO = 'not yet';

# 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('/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');

}

###############################################################################
