|  | #!/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 | 
|  |  | 
|  | TODO: { | 
|  | local $TODO = 'not yet' unless $t->has_version('1.13.5'); | 
|  |  | 
|  | 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'); | 
|  |  | 
|  | ############################################################################### |