| #!/usr/bin/perl | |
| # (C) Maxim Dounin | |
| # Tests for not modified filter 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('http')->plan(15) | |
| ->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; | |
| location / { | |
| if_modified_since before; | |
| } | |
| } | |
| } | |
| EOF | |
| $t->write_file('t', ''); | |
| $t->run(); | |
| ############################################################################### | |
| like(http_get_ims('/t', 'Wed, 08 Jul 2037 22:53:52 GMT'), qr/ 304 /, | |
| '0x7F000000'); | |
| like(http_get_ims('/t', 'Tue, 19 Jan 2038 03:14:07 GMT'), qr/ 304 /, | |
| '0x7FFFFFFF'); | |
| SKIP: { | |
| skip "only for 32-bit time_t", 2 if (gmtime(0xFFFFFFFF))[5] == 206; | |
| like(http_get_ims('/t', 'Tue, 19 Jan 2038 03:14:08 GMT'), qr/ 200 /, | |
| '0x7FFFFFFF + 1'); | |
| like(http_get_ims('/t', 'Fri, 25 Feb 2174 09:42:23 GMT'), qr/ 200 /, | |
| '0x17FFFFFFF'); | |
| } | |
| # If-Match, If-None-Match tests | |
| my ($t1, $etag); | |
| $t1 = http_get('/t'); | |
| $t1 =~ /ETag: (".*")/; | |
| $etag = $1; | |
| like(http_get_inm('/t', $etag), qr/ 304 /, 'if-none-match'); | |
| like(http_get_inm('/t', '"foo"'), qr/ 200 /, 'if-none-match fail'); | |
| like(http_get_inm('/t', '"foo", "bar", ' . $etag . ' , "baz"'), qr/ 304 /, | |
| 'if-none-match with complex list'); | |
| like(http_get_inm('/t', '*'), qr/ 304 /, 'if-none-match all'); | |
| like(http_get_inm('/t', 'W/' . $etag), qr/ 304 /, 'if-none-match weak'); | |
| like(http_get_im('/t', $etag), qr/ 200 /, 'if-match'); | |
| like(http_get_im('/t', '"foo"'), qr/ 412 /, 'if-match fail'); | |
| like(http_get_im('/t', '"foo", "bar", ' . "\t" . $etag . ' , "baz"'), | |
| qr/ 200 /, 'if-match with complex list'); | |
| like(http_get_im('/t', '*'), qr/ 200 /, 'if-match all'); | |
| like(http_get_im('/t', 'W/' . $etag), qr/ 412 /, 'if-match weak fail'); | |
| # server MUST ignore precondition if its response wouldn't be 2xx or 412 | |
| like(http_get_im('/nx', '"foo"'), qr/ 404 /, 'if-match ignored with 404'); | |
| ############################################################################### | |
| sub http_get_ims { | |
| my ($url, $ims) = @_; | |
| return http(<<EOF); | |
| GET $url HTTP/1.0 | |
| Host: localhost | |
| If-Modified-Since: $ims | |
| EOF | |
| } | |
| sub http_get_inm { | |
| my ($url, $inm) = @_; | |
| return http(<<EOF); | |
| GET $url HTTP/1.0 | |
| Host: localhost | |
| If-None-Match: $inm | |
| EOF | |
| } | |
| sub http_get_im { | |
| my ($url, $inm) = @_; | |
| return http(<<EOF); | |
| GET $url HTTP/1.0 | |
| Host: localhost | |
| If-Match: $inm | |
| EOF | |
| } | |
| ############################################################################### |