| #!/usr/bin/perl | |
| # (C) Maxim Dounin | |
| # Tests for sub filter. | |
| ############################################################################### | |
| 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 rewrite sub proxy/)->plan(30) | |
| ->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; | |
| sub_filter_types *; | |
| sub_filter foo bar; | |
| location / { | |
| } | |
| location /once { | |
| return 200 $arg_b; | |
| } | |
| location /many { | |
| sub_filter_once off; | |
| return 200 $arg_b; | |
| } | |
| location /complex { | |
| sub_filter abac _replaced; | |
| return 200 $arg_b; | |
| } | |
| location /complex2 { | |
| sub_filter ababX _replaced; | |
| return 200 $arg_b; | |
| } | |
| location /complex3 { | |
| sub_filter aab _replaced; | |
| return 200 $arg_b; | |
| } | |
| location /single { | |
| sub_filter A B; | |
| return 200 $arg_b; | |
| } | |
| location /single/many { | |
| sub_filter A B; | |
| sub_filter_once off; | |
| return 200 $arg_b; | |
| } | |
| location /var/string { | |
| sub_filter X$arg_a _replaced; | |
| return 200 $arg_b; | |
| } | |
| location /var/replacement { | |
| sub_filter aab '${arg_a}_replaced'; | |
| return 200 $arg_b; | |
| } | |
| location /lm { | |
| sub_filter_last_modified on; | |
| proxy_pass http://127.0.0.1:8081/; | |
| } | |
| } | |
| server { | |
| listen 127.0.0.1:8081; | |
| server_name localhost; | |
| } | |
| } | |
| EOF | |
| $t->write_file('foo.html', 'foo'); | |
| $t->write_file('foo_uc.html', 'FOO'); | |
| $t->write_file('foofoo.html', 'foofoo'); | |
| $t->run(); | |
| ############################################################################### | |
| like(http_get('/foo.html'), qr/bar/, 'sub_filter'); | |
| like(http_get('/foo_uc.html'), qr/bar/, 'sub_filter caseless'); | |
| like(http_get('/foofoo.html'), qr/barfoo/, 'once default'); | |
| like(http_get('/once?b=foofoo'), qr/barfoo/, 'once'); | |
| like(http_get('/many?b=foofoo'), qr/barbar/, 'many'); | |
| like(http_get('/many?b=fo'), qr/fo/, 'incomplete'); | |
| like(http_get('/many?b=foofo'), qr/barfo/, 'incomplete long'); | |
| like(http_get('/complex?b=abac'), qr/_replaced/, 'complex'); | |
| like(http_get('/complex?b=abaabac'), qr/aba_replaced/, 'complex 1st char'); | |
| like(http_get('/complex?b=ababac'), qr/replaced/, 'complex 2nd char'); | |
| like(http_get('/complex2?b=ababX'), qr/_replaced/, 'complex2'); | |
| like(http_get('/complex2?b=abababX'), qr/ab_replaced/, 'complex2 long'); | |
| like(http_get('/complex3?b=aab'), qr/_replaced/, 'complex3 aab in aab'); | |
| like(http_get('/complex3?b=aaab'), qr/a_replaced/, 'complex3 aab in aaab'); | |
| like(http_get('/complex3?b=aaaab'), qr/aa_replaced/, 'complex3 aab in aaaab'); | |
| like(http_get('/single?b=A'), qr/B/, 'single only'); | |
| like(http_get('/single?b=AA'), qr/BA/, 'single begin'); | |
| like(http_get('/single?b=CAAC'), qr/CBAC/, 'single middle'); | |
| like(http_get('/single?b=CA'), qr/CB/, 'single end'); | |
| like(http_get('/single/many?b=A'), qr/B/, 'single many only'); | |
| like(http_get('/single/many?b=AA'), qr/BB/, 'single many begin'); | |
| like(http_get('/single/many?b=CAAC'), qr/CBBC/, 'single many middle'); | |
| like(http_get('/single/many?b=CA'), qr/CB/, 'single many end'); | |
| like(http_get('/var/string?a=foo&b=Xfoo'), qr/_replaced/, 'complex string'); | |
| like(http_get('/var/string?a=foo&b=XFOO'), qr/_replaced/, | |
| 'complex string caseless'); | |
| like(http_get('/var/string?a=abcdefghijklmnopq&b=Xabcdefghijklmnopq'), | |
| qr/_replaced/, 'complex string long'); | |
| like(http_get('/var/replacement?a=ee&b=aaab'), qr/aee_replaced/, | |
| 'complex replacement'); | |
| unlike(http_get('/foo.html'), qr/(Last-Modified|ETag)/, 'no last modified'); | |
| like(http_get('/lm/foo.html'), qr/Last-Modified/, 'last modified'); | |
| like(http_get('/lm/foo.html'), qr!ETag: W/"[^"]+"!, 'last modified weak'); | |
| ############################################################################### |