#!/usr/bin/perl

# (C) Sergey Kandaurov

# Tests for referer module.

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

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 referer rewrite/)->plan(54);

$t->write_file_expand('nginx.conf', <<'EOF');

%%TEST_GLOBALS%%

daemon off;

events {
}

http {
    %%TEST_GLOBALS_HTTP%%

    server {
        listen       127.0.0.1:8080;
        server_name  another;

        valid_referers server_names;
        return 200 "$host value $invalid_referer";
    }

    server {
        listen       127.0.0.1:8080;
        server_name  _;

        location / {
            valid_referers server_names;
            return 200 "$host value $invalid_referer";
        }
        server_name  below;
    }

    server {
        listen       127.0.0.1:8080;
        server_name  localhost ~bar ~^anchoredre$;

        location /blocked {
            valid_referers blocked www.example.org;
            return 200 "value $invalid_referer";
        }
        location /none {
            valid_referers none www.example.org;
            return 200 "value $invalid_referer";
        }
        location /simple {
            valid_referers www.example.org;
            return 200 "value $invalid_referer";
        }
        location /regex {
            valid_referers ~example.org ~(?-i)example.net;
            return 200 "value $invalid_referer";
        }
        location /regex2 {
            valid_referers ~example.org/uri;
            return 200 "value $invalid_referer";
        }
        location /regex3 {
            valid_referers ~example.org$;
            return 200 "value $invalid_referer";
        }
        location /uri {
            valid_referers www.example.org/uri;
            return 200 "value $invalid_referer";
        }
        location /sn {
            valid_referers server_names;
            return 200 "value $invalid_referer";
        }
        location /sn_blocked {
            valid_referers blocked server_names;
            return 200 "value $invalid_referer";
        }
        location /wc {
            valid_referers *.example.com *.example.org www.example.* example.*;
            return 200 "value $invalid_referer";
        }
        location /long {
            valid_referers ~.*;
            return 200 "value $invalid_referer";
        }
        location /wc2 {
            valid_referers www.example.*/uri;
            return 200 "value $invalid_referer";
        }
    }
}

EOF

$t->run();

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

ok(valid('/simple', 'http://www.example.org'), 'simple');
ok(valid('/simple', 'http://www.example.org/uri'), 'simple uri');
ok(valid('/simple', 'http://www.example.org:' . port(8080) . '/uri'),
	'simple port uri');
ok(!valid('/simple', 'localhost'), 'simple invalid');
ok(valid('/simple', 'https://www.example.org'), 'https');
ok(!valid('/simple', 'example.com'), 'no scheme');
ok(!valid('/simple'), 'no none');
ok(valid('/none'), 'none');
ok(!valid('/none', ''), 'none empty');

ok(valid('/blocked', 'www.example.org'), 'blocked');
ok(valid('/blocked', 'www.example.com'), 'blocked 2');
ok(valid('/blocked', 'http://su'), 'blocked short');
ok(valid('/blocked', 'foobar'), 'blocked short no scheme');
ok(valid('/blocked', ''), 'blocked empty');

ok(!valid('/simple', 'foobar'), 'small');
ok(valid('/simple', 'http://www.example.org/' . 'a' x 256), 'long uri');
ok(!valid('/simple', 'http://www.example.' . 'a' x 256), 'long hostname');
ok(!valid('/wc', 'http://example.' . 'a' x 256), 'long hostname wildcard');

ok(valid('/long', 'http://' . 'a' x 255), 'long hostname 255');
ok(valid('/long', 'http://' . 'a' x 256), 'long hostname 256');
ok(!valid('/long', 'http://' . 'a' x 257), 'long hostname 257');

ok(valid('/uri', 'http://www.example.org/uri'), 'uri');
ok(valid('/uri', 'http://www.example.org/urii'), 'uri prefix');
ok(!valid('/uri', 'http://www.example.org/uRi'), 'uri case');
ok(valid('/uri', 'http://www.example.org:' . port(8080) . '/urii'), 'uri port');
ok(!valid('/uri', 'http://www.example.org/ur'), 'uri invalid len');
ok(!valid('/uri', 'http://www.example.org/urd'), 'uri invalid cmp');

ok(valid('/regex', 'http://www.example.org'), 'regex');
ok(valid('/regex', 'http://www.eXample.org'), 'regex caseless');
ok(valid('/regex', 'http://www.example.org/uri'), 'regex uri');
ok(!valid('/regex', 'http://www.example.com'), 'regex mismatch');
ok(!valid('/regex', 'http://www.eXample.net'), 'regex case mismatch');

ok(valid('/regex2', 'http://www.example.org/uri'), 'regex 2 uri');
ok(!valid('/regex2', 'http://www.example.org'), 'regex 2 no uri');
ok(valid('/regex2', 'http://www.example.org/uRI'), 'regex 2 uri caseless');
ok(valid('/regex3', 'https://www.eXample.org'), 'regex https');

ok(valid('/sn', 'http://localhost'), 'server_names');
ok(valid('/sn', 'http://localHost'), 'server_names caseless');
ok(valid('/sn', 'http://localhost/uri'), 'server_names uri');
ok(valid('/sn', 'http://foobar'), 'server_names regex');
ok(valid('/sn', 'http://foobAr'), 'server_names regex caseless');
ok(valid('/sn', 'http://foobAr/uri'), 'server_names regex caseless uri');
ok(valid('/sn', 'http://anchoredre/uri'), 'server_names regex anchored');
ok(valid('/sn', 'http://foobar/uri'), 'server_names regex uri');
ok(!valid('/sn', 'localhost'), 'server_names no scheme');
ok(!valid('/sn', 'foobar'), 'server_names regex no scheme');
ok(valid('/sn_blocked', 'localhost'), 'server_names no scheme blocked');

ok(valid('/wc', 'http://www.example.org'), 'wildcard head');
ok(valid('/wc', 'http://www.example.net'), 'wildcard tail');
ok(valid('/wc2', 'http://www.example.net/uri'), 'wildcard uri');
ok(valid('/wc2', 'http://www.example.net/urii'), 'wildcard uri prefix');
ok(!valid('/wc2', 'http://www.example.net/uRI'), 'wildcard uri case');

ok(valid('/', 'http://another', 'another'), 'server context');

# server_name below valid_referers

ok(valid('/', 'http://below', 'below'), 'server below');

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

sub valid {
	my ($uri, $referer, $host) = @_;
	my $text;

	$host = 'localhost' unless defined $host;

	unless (defined $referer) {
		$text = http_get($uri);
	} else {
		$text = http(<<EOF);
GET $uri HTTP/1.0
Host: $host
Referer: $referer

EOF
	}

	$text =~ /value 1/ && return 0;
	$text =~ /value/ && return 1;
	fail("no valid_referers in $uri");
}

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