# HG changeset patch # User Sergey Kandaurov # Date 1376996664 -14400 # Node ID f98e8674361baab27b6cc960ea3b62b64b4612d0 # Parent 3da39688c14b45f4288bfceb26e314c382fcd3f5 Tests: referer tests. diff --git a/referer.t b/referer.t new file mode 100644 --- /dev/null +++ b/referer.t @@ -0,0 +1,217 @@ +#!/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(49); + +$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; + + 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; + 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 /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: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('/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: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('/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'); + +TODO: { +local $TODO = 'not yet'; + +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'); + +TODO: { +local $TODO = 'not yet'; + +ok(valid('/sn', 'http://foobAr'), 'server_names regex caseless'); +ok(valid('/sn', 'http://foobAr/uri'), 'server_names regex caseless uri'); + +} + +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 + +TODO: { +local $TODO = 'not yet'; + +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(<