Mercurial > hg > nginx-tests
changeset 418:861e6cad6299
Tests: tests for not modified filter with proxy.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 23 Jun 2014 04:35:34 +0400 |
parents | 1bdd58f388f6 |
children | f5f2a66853a9 |
files | not_modified_proxy.t |
diffstat | 1 files changed, 132 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/not_modified_proxy.t @@ -0,0 +1,132 @@ +#!/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; + +plan(skip_all => 'win32') if $^O eq 'MSWin32'; + +my $t = Test::Nginx->new()->has(qw/http proxy cache/)->plan(9) + ->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-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'); + +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'); + +TODO: { +local $TODO = 'not yet'; + +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_inm { + my ($url, $inm) = @_; + return http(<<EOF); +GET $url HTTP/1.0 +Host: localhost +If-None-Match: $inm + +EOF +} + +###############################################################################