| #!/usr/bin/perl |
| |
| # (C) Maxim Dounin |
| |
| # Tests for not modified filter module and it's interaction with proxy. |
| # |
| # Notably, requests which are proxied should be skipped (that is, if |
| # a backend returned 200, we should pass 200 to a client without any |
| # attempts to handle conditional headers in the request), but responses |
| # from cache should be handled. |
| |
| ############################################################################### |
| |
| 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 cache/)->plan(12); |
| |
| $t->write_file_expand('nginx.conf', <<'EOF'); |
| |
| %%TEST_GLOBALS%% |
| |
| daemon off; |
| |
| events { |
| } |
| |
| http { |
| %%TEST_GLOBALS_HTTP%% |
| |
| proxy_cache_path %%TESTDIR%%/cache keys_zone=one:1m; |
| |
| proxy_set_header If-Modified-Since ""; |
| proxy_set_header If-Unmodified-Since ""; |
| proxy_set_header If-None-Match ""; |
| |
| server { |
| listen 127.0.0.1:8080; |
| server_name localhost; |
| |
| location / { |
| } |
| |
| location /etag { |
| add_header Last-Modified ""; |
| } |
| |
| location /proxy/ { |
| proxy_pass http://127.0.0.1:8080/; |
| } |
| |
| location /cache/ { |
| proxy_pass http://127.0.0.1:8080/; |
| proxy_cache one; |
| proxy_cache_valid 200 1y; |
| } |
| } |
| } |
| |
| EOF |
| |
| $t->write_file('t', ''); |
| $t->write_file('etag', ''); |
| |
| $t->run(); |
| |
| ############################################################################### |
| |
| my ($t1, $lm, $etag); |
| |
| $t1 = http_get('/cache/t'); |
| $t1 =~ /Last-Modified: (.*)/; $lm = $1; |
| $t1 =~ /ETag: (.*)/; $etag = $1; |
| |
| like(http_get_ims('/t', $lm), qr/ 304 /, 'if-modified-since'); |
| like(http_get_ims('/proxy/t', $lm), qr/ 200 /, 'ims proxy ignored'); |
| like(http_get_ims('/cache/t', $lm), qr/ 304 /, 'ims from cache'); |
| |
| $t1 = 'Fri, 05 Jul 1985 14:30:52 GMT'; |
| |
| like(http_get_iums('/t', $t1), qr/ 412 /, 'if-unmodified-since'); |
| like(http_get_iums('/proxy/t', $t1), qr/ 200 /, 'iums proxy ignored'); |
| like(http_get_iums('/cache/t', $t1), qr/ 412 /, 'iums from cache'); |
| |
| like(http_get_inm('/t', $etag), qr/ 304 /, 'if-none-match'); |
| like(http_get_inm('/proxy/t', $etag), qr/ 200 /, 'inm proxy ignored'); |
| like(http_get_inm('/cache/t', $etag), qr/ 304 /, 'inm from cache'); |
| |
| # backend response with ETag only, no Last-Modified |
| |
| $t1 = http_get('/cache/etag'); |
| $t1 =~ /ETag: (.*)/; $etag = $1; |
| |
| like(http_get_inm('/etag', $etag), qr/ 304 /, 'if-none-match etag only'); |
| like(http_get_inm('/proxy/etag', $etag), qr/ 200 /, 'inm etag proxy ignored'); |
| like(http_get_inm('/cache/etag', $etag), qr/ 304 /, 'inm etag from cache'); |
| |
| ############################################################################### |
| |
| 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_iums { |
| my ($url, $ims) = @_; |
| return http(<<EOF); |
| GET $url HTTP/1.0 |
| Host: localhost |
| If-Unmodified-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 |
| } |
| |
| ############################################################################### |