| #!/usr/bin/perl |
| |
| # (C) Maxim Dounin |
| |
| # Tests for http filter finalize code. |
| |
| ############################################################################### |
| |
| 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 image_filter limit_req/) |
| ->has(qw/rewrite/)->plan(3) |
| ->write_file_expand('nginx.conf', <<'EOF'); |
| |
| %%TEST_GLOBALS%% |
| |
| daemon off; |
| |
| events { |
| } |
| |
| http { |
| %%TEST_GLOBALS_HTTP%% |
| |
| proxy_cache_path %%TESTDIR%%/cache keys_zone=cache:1m; |
| |
| limit_req_zone $binary_remote_addr zone=limit:1m rate=25r/m; |
| |
| log_format time "$request_uri:$status:$upstream_response_time"; |
| access_log time.log time; |
| |
| upstream u { |
| server 127.0.0.1:8081; |
| server 127.0.0.1:8081; |
| server 127.0.0.1:8081; |
| server 127.0.0.1:8081; |
| server 127.0.0.1:8080; |
| } |
| |
| server { |
| listen 127.0.0.1:8080; |
| server_name localhost; |
| |
| # this used to cause a segmentation fault before 07f028df3879 (1.3.1) |
| # http://nginx.org/pipermail/nginx/2011-January/024703.html |
| |
| location /t1 { |
| proxy_pass http://127.0.0.1:8080/bad; |
| proxy_cache cache; |
| proxy_cache_valid any 1h; |
| |
| image_filter resize 150 100; |
| error_page 415 = /empty; |
| } |
| |
| location /empty { |
| return 204; |
| } |
| |
| location /bad { |
| return 404; |
| } |
| |
| # another segfault, introduced in 204b780a89de (1.3.0), |
| # fixed in 07f028df3879 (1.3.1) |
| |
| location /t2 { |
| proxy_pass http://127.0.0.1:8080/big; |
| proxy_store on; |
| |
| image_filter_buffer 10m; |
| image_filter resize 150 100; |
| error_page 415 = /empty; |
| } |
| |
| location /big { |
| # big enough static file |
| } |
| |
| # filter finalization may cause duplicate upstream finalization, |
| # resulting in wrong $upstream_response_time, |
| # http://nginx.org/pipermail/nginx-devel/2015-February/006539.html |
| |
| # note that we'll need upstream response time to be at least 1 second, |
| # and at least 4 failed requests to make sure r->upstream_states will |
| # not be reallocated |
| |
| location /t3 { |
| proxy_pass http://u/slow; |
| proxy_buffering off; |
| |
| image_filter resize 150 100; |
| error_page 415 = /upstream; |
| } |
| |
| location /slow { |
| limit_req zone=limit burst=5; |
| } |
| |
| location /upstream { |
| proxy_pass http://127.0.0.1:8080/empty; |
| } |
| |
| location /time.log { |
| # access to log |
| } |
| } |
| |
| server { |
| listen 127.0.0.1:8081; |
| server_name localhost; |
| return 444; |
| } |
| } |
| |
| EOF |
| |
| $t->write_file('big', "x" x 10240000); |
| $t->write_file('slow', "x"); |
| |
| $t->run(); |
| |
| ############################################################################### |
| |
| like(http_get('/t1'), qr/HTTP/, 'image filter and cache'); |
| like(http_get('/t2'), qr/HTTP/, 'image filter and store'); |
| |
| http_get('/slow'); |
| http_get('/t3'); |
| like(http_get('/time.log'), qr!/t3:.*, [1-9]\.!, 'upstream response time'); |
| |
| # "aio_write" is used to produce the following alert on some platforms: |
| # "readv() failed (9: Bad file descriptor) while reading upstream" |
| |
| $t->todo_alerts() if $t->read_file('nginx.conf') =~ /aio_write on/ |
| and $t->read_file('nginx.conf') =~ /aio threads/; |
| |
| ############################################################################### |