blob: 177c9491f05eb80c52effbabafd90a59b8bd765f [file] [log] [blame]
#!/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");
}
###############################################################################