blob: 44538c10427bbef7fafcb79d95634d55a8a68b9d [file] [log] [blame]
#!/usr/bin/perl
# (C) Sergey Kandaurov
# (C) Maxim Dounin
# (C) Nginx, Inc.
# Tests for headers 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 proxy/)->plan(28)
->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;
add_header X-URI $uri;
add_header X-Always $uri always;
add_header ETag foo always;
add_header ETag '' always;
expires epoch;
location /t1 {
}
location /nx {
}
location /epoch {
expires epoch;
}
location /max {
expires max;
}
location /off {
expires off;
}
location /access {
expires 2048;
location /access_inner {
# inherited from outer
}
}
location /negative {
expires -2048;
}
location /daily {
expires @15h30m33s;
}
location /modified {
expires modified 2048;
location /modified/proxy {
proxy_pass http://127.0.0.1:8081/modified;
}
}
location /var {
expires $arg_e;
location /var_inner {
# inherited from outer
}
location /var_modified {
expires modified $arg_e;
}
}
}
server {
listen 127.0.0.1:8081;
server_name localhost;
add_header Last-Modified "Mon, 28 Sep 1970 06:00:00 GMT";
}
}
EOF
$t->write_file('t1', '');
$t->write_file('epoch', '');
$t->write_file('max', '');
$t->write_file('off', '');
$t->write_file('access', '');
$t->write_file('access_inner', '');
$t->write_file('negative', '');
$t->write_file('daily', '');
$t->write_file('modified', '');
$t->write_file('var', '');
$t->write_file('var_inner', '');
$t->write_file('var_modified', '');
$t->run();
###############################################################################
my $r;
# test for header field presence
$r = http_get('/t1');
like($r, qr/Cache-Control/, 'good expires');
like($r, qr/X-URI/, 'good add_header');
like($r, qr/X-Always/, 'good add_header always');
unlike($r, qr/ETag/, 'good add_header always empty');
$r = http_get('/nx');
unlike($r, qr/Cache-Control/, 'bad expires');
unlike($r, qr/X-URI/, 'bad add_header');
like($r, qr/X-Always/, 'bad add_header always');
unlike($r, qr/ETag/, 'bad add_header always empty');
# various expires variants
like(http_get('/epoch'), qr/Expires:.*1970/, 'expires epoch');
like(http_get('/max'), qr/Expires:.*2037/, 'expires max');
unlike(http_get('/off'), qr/Expires:/, 'expires off');
like(http_get('/access'), qr/max-age=2048/, 'expires access');
like(http_get('/access_inner'), qr/max-age=2048/, 'expires inner');
like(http_get('/negative'), qr/no-cache/, 'expires negative');
like(http_get('/daily'), qr/Expires:.*:33 GMT/, 'expires daily');
like(http_get('/modified'), qr/max-age=204./, 'expires modified');
# "expires modified" with proxy
like(http_get('/modified/proxy'), qr/Expires: Mon, 28 Sep 1970 06:34:08 GMT/,
'expires modified proxy');
# expires with variables
like(http_get('/var?e=epoch'), qr/Expires:.*1970/, 'expires var epoch');
like(http_get('/var?e=max'), qr/Expires:.*2037/, 'expires var max');
unlike(http_get('/var?e=off'), qr/Expires:/, 'expires var off');
like(http_get('/var?e=2048'), qr/max-age=2048/, 'expires var access');
like(http_get('/var_inner?e=2048'), qr/max-age=2048/, 'expires var inner');
like(http_get('/var?e=-2048'), qr/no-cache/, 'expires var negative');
like(http_get('/var?e=@33s'), qr/Expires:.*:33 GMT/, 'expires var daily');
like(http_get('/var_modified?e=2048'), qr/max-age=204./,
'expires var modified');
# some invalid cases
unlike(http_get('/var'), qr/Expires/, 'expires var empty');
unlike(http_get('/var?e=bad'), qr/Expires/, 'expires var bad');
unlike(http_get('/var_modified?e=epoch'), qr/Expires/,
'expires var modified epoch');
###############################################################################