view sub_filter_multi.t @ 1606:e4e0695552ed

Tests: fixed stream_proxy_ssl_conf_command.t. The stream_proxy_ssl_conf_command.t test used stream return module to return the response. Since this ignores actual request, but the perl test code used http_get(). This might result in the request being sent after the response is returned and the connection closed by the server, resulting in RST being generated and no response seen by the client at all. Fix is to use "stream(...)->read()" instead of http_get(), so no request is sent at all, eliminating possibility of RST being generated.
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 10 Nov 2020 05:03:29 +0300
parents 196d33c2bb45
children
line wrap: on
line source

#!/usr/bin/perl

# (C) Dmitry Volyntsev
# (C) Nginx, Inc.

# Tests for multiple patterns in 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(42);

my $long_pattern = '0123456789abcdef' x 17;

(my $conf = <<'EOF') =~ s/%%LONG_PATTERN%%/$long_pattern/g;

%%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 /multi {
            sub_filter_once off;
            sub_filter aab +;
            sub_filter yyz -;
            return 200 $arg_a;
        }

        location /multi2 {
            sub_filter_once off;
            sub_filter aabb  +;
            sub_filter aaabb -;
            return 200 $arg_a;
        }

        location /multi3 {
            sub_filter_once off;
            sub_filter aacbb +;
            sub_filter aadbb -;
            return 200 $arg_a;
        }

        location /case {
            sub_filter_once off;
            sub_filter AAB +;
            sub_filter YYZ -;
            return 200 $arg_a;
        }

        location /case2 {
            sub_filter_once off;
            sub_filter ABCDEFGHIJKLMNOPQRSTUVWXYZ +;
            return 200 $arg_a;
        }

        location /case3 {
            sub_filter_once off;
            sub_filter abcdefghijklmnopqrstuvwxyz +;
            return 200 $arg_a;
        }

        location /minimal {
            sub_filter_once off;
            sub_filter ab +;
            sub_filter cd -;
            sub_filter ef *;
            sub_filter gh !;
            sub_filter x  _;
            return 200 $arg_a;
        }

        location /once {
            sub_filter aab +;
            sub_filter yyz -;
            return 200 $arg_a;
        }

        location /table/inheritance {
            sub_filter_once off;
            return 200 $arg_a;
        }

        location /utf8 {
            sub_filter_once off;
            sub_filter 模様 замена1;
            sub_filter पैटर्न замена2;
            sub_filter паттерн replaced;
            return 200 $arg_a;
        }

        location /var/replacement/multi {
            sub_filter_once off;
            sub_filter aab '${arg_a}_replaced';
            sub_filter yyz '${arg_b}_replaced';
            return 200 $arg_c;
        }

        location /crossbuf/match1 {
            sub_filter_once off;
            sub_filter abpattyz +;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/match2 {
            sub_filter_once off;
            sub_filter abpattrnyz +;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/match3 {
            sub_filter_once off;
            sub_filter abpatternyz +;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/match4 {
            sub_filter_once off;
            sub_filter abpattternyz +;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/match5-01 {
            sub_filter_once off;
            sub_filter abyz +;
            sub_filter abpattternyz -;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/match5-02 {
            sub_filter_once off;
            sub_filter abpayz +;
            sub_filter abpattternyz -;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/match6 {
            sub_filter_once off;
            sub_filter abpattxernyz +;
            sub_filter abpattternyz -;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/superlong/match1 {
            sub_filter_once off;
            sub_filter %%LONG_PATTERN%% +;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/superlong/match2 {
            sub_filter_once off;
            sub_filter %%LONG_PATTERN%% +;
            sub_filter yz -;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/superlong/match3 {
            sub_filter_once off;
            sub_filter %%LONG_PATTERN%% +;
            sub_filter 01ef -;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/superlong/match4 {
            sub_filter_once off;
            sub_filter %%LONG_PATTERN%% +;
            sub_filter 01ef -;
            sub_filter _ *;
            alias %%TESTDIR%%/;
        }

        location /shortbuf/match1 {
            sub_filter_once off;
            sub_filter abpatternyz +;

            proxy_pass http://127.0.0.1:8081/;
            proxy_buffering off;
        }

        location /shortbuf/match2 {
            sub_filter_once off;
            sub_filter abpatternyz +;
            sub_filter abpaernyz -;

            proxy_pass http://127.0.0.1:8081/;
            proxy_buffering off;
        }

        location /shortbuf/match3 {
            sub_filter_once off;
            sub_filter abpatternyz +;
            sub_filter abpaernyz -;
            sub_filter _ *;

            proxy_pass http://127.0.0.1:8081/;
            proxy_buffering off;
        }

        location /shortbuf/match4 {
            sub_filter_once off;
            sub_filter patt +;

            proxy_pass http://127.0.0.1:8081/;
            proxy_buffering off;
        }

        location /shortbuf/match5 {
            sub_filter_once off;
            sub_filter abpatternyz +;
            sub_filter abpa -;
            sub_filter tter *;

            proxy_pass http://127.0.0.1:8081/;
            proxy_buffering off;
        }
    }

    server {
        listen       127.0.0.1:8081;

        limit_rate 4;
        limit_rate_after 160;

        location / {
            return 200 $arg_a;
        }
    }
}

EOF

$t->write_file_expand('nginx.conf', $conf);

$t->write_file('huge1.html', 'abpattyz' x 6000);
$t->write_file('huge2.html', 'abpattrnyz' x 5000);
$t->write_file('huge3.html', 'abpatternyz' x 4000);
$t->write_file('huge4.html', 'abpattternyz' x 4000);

$t->write_file('huge5-01.html', 'abpatternyzA' x 4000);
$t->write_file('huge5-02.html', 'abpatternyzABCDEFGHIJ' x 4000);
$t->write_file('huge5-03.html', 'abpatternyzABCDEFGHIJK' x 4000);
$t->write_file('huge5-04.html', 'abpatternyzABCDEFGHIJKL' x 4000);

$t->write_file('huge6-01.html', 'abyzAabpattternyz' x 3000);
$t->write_file('huge6-02.html', 'abpayzAabpattternyz' x 3000);

$t->write_file('huge7-01.html', 'abpattxernyzabpattternyz' x 3000);
$t->write_file('huge7-02.html', 'abpattxernyzAabpattternyz' x 3000);
$t->write_file('huge7-03.html', 'abpattxernyzABCDEFGHIJabpattternyz' x 3000);
$t->write_file('huge7-04.html', 'abpattxernyzABCDEFGHIJKabpattternyz' x 3000);
$t->write_file('huge7-05.html', 'abpattxernyzABCDEFGHIJKLabpattternyz' x 3000);

$t->write_file('huge8.html', scalar ('ABC' . $long_pattern . 'XYZ') x 1000);
$t->write_file('huge9.html', scalar ('ABC' . $long_pattern . 'yz') x 1000);
$t->write_file('huge10-01.html', scalar ($long_pattern . 'ABC01ef') x 1000);
$t->write_file('huge10-02.html', scalar ('01efABC' . $long_pattern) x 1000);
$t->write_file('huge11.html', scalar ('01efA_Z' . $long_pattern) x 1000);

$t->run();

###############################################################################

like(http_get('/multi?a=aabAyyzBaab'), qr/\+A-B\+/, 'simple match');
like(http_get('/multi2?a=aabbaaabbaabb'), qr/\+-\+/, 'partial match');
like(http_get('/multi3?a=aadbbaacbb'), qr/-\+/, 'exact match');

like(http_get('/multi?a=AABYYZAAB'), qr/\+-\+/, 'case insensivity 1');
like(http_get('/case?a=aabyyzaab'), qr/\+-\+/, 'case insensivity 2');
like(http_get('/case2?a=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'),
	qr/\+\+/, 'case insensivity 3');
like(http_get('/case3?a=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'),
	qr/\+\+/, 'case insensivity 4');

like(http_get('/minimal?a=AAabcdefghBxBabCxCcdDDefEEghFF'),
	qr/AA\+-\*!B_B\+C_C-DD\*EE!FF/, 'minimal match');

like(http_get('/utf8?a=ТЕКСТ模様ТЕКСТ2पैटर्नТЕКСТ3паттерн'),
	qr/ТЕКСТзамена1ТЕКСТ2замена2ТЕКСТ3replaced/, 'utf8 match');

like(http_get('/once?a=aabyyzaab'), qr/\+-aab/, 'once 1');
like(http_get('/once?a=yyzaabyyz'), qr/-\+yyz/, 'once 2');
like(http_get('/once?a=yyzyyzaabaabyyz'), qr/-yyz\+aabyyz/, 'once 3');

like(http_get('/table/inheritance?a=foofoo'), qr/barbar/, 'table inheritance');

like(http_get('/var/replacement/multi?a=A&b=B&c=aabyyzaab'),
	qr/A_replacedB_replacedA_replaced/, 'complex multiple replace');

like(http_get('/crossbuf/match1/huge1.html'), qr/\+{6000}/,
	'crossbuf match 1 (simple match len 8)');
like(http_get('/crossbuf/match2/huge2.html'), qr/\+{5000}/,
	'crossbuf match 2 (simple match len 9)');
like(http_get('/crossbuf/match3/huge3.html'), qr/\+{4000}/,
	'crossbuf match 3 (simple match len 10)');
like(http_get('/crossbuf/match4/huge4.html'), qr/\+{4000}/,
	'crossbuf match 4 (simple match len 11)');

like(http_get('/crossbuf/match3/huge5-01.html'), qr/(\+A){4000}/,
	'crossbuf match 5.1');
like(http_get('/crossbuf/match3/huge5-02.html'), qr/(\+ABCDEFGHIJ){4000}/,
	'crossbuf match 5.2');
like(http_get('/crossbuf/match3/huge5-03.html'), qr/(\+ABCDEFGHIJK){4000}/,
	'crossbuf match 5.3');
like(http_get('/crossbuf/match3/huge5-04.html'), qr/(\+ABCDEFGHIJKL){4000}/,
	'crossbuf match 5.4');

like(http_get('/crossbuf/match5-01/huge6-01.html'), qr/(\+A-){3000}/,
	'crossbuf match 6.1 (multiple replace)');
like(http_get('/crossbuf/match5-02/huge6-02.html'), qr/(\+A-){3000}/,
	'crossbuf match 6.2 (multiple replace)');

like(http_get('/crossbuf/match6/huge7-01.html'), qr/(\+-){3000}/,
	'crossbuf match 7.1 (multiple replace)');
like(http_get('/crossbuf/match6/huge7-02.html'), qr/(\+A-){3000}/,
	'crossbuf match 7.2 (multiple replace)');
like(http_get('/crossbuf/match6/huge7-03.html'), qr/(\+ABCDEFGHIJ-){3000}/,
	'crossbuf match 7.3 (multiple replace)');
like(http_get('/crossbuf/match6/huge7-04.html'), qr/(\+ABCDEFGHIJK-){3000}/,
	'crossbuf match 7.4 (multiple replace)');
like(http_get('/crossbuf/match6/huge7-05.html'), qr/(\+ABCDEFGHIJKL-){3000}/,
	'crossbuf match 7.5 (multiple replace)');

like(http_get('/crossbuf/superlong/match1/huge8.html'), qr/(ABC\+XYZ){1000}/,
	'crossbuf superlong match 1');
like(http_get('/crossbuf/superlong/match2/huge9.html'), qr/(ABC\+-){1000}/,
	'crossbuf superlong match 2 (multiple replace)');
like(http_get('/crossbuf/superlong/match3/huge10-01.html'), qr/(\+ABC-){1000}/,
	'crossbuf superlong match 3.1 (multiple replace)');
like(http_get('/crossbuf/superlong/match3/huge10-02.html'), qr/(-ABC\+){1000}/,
	'crossbuf superlong match 3.2 (multiple replace)');
like(http_get('/crossbuf/superlong/match4/huge11.html'), qr/(-A\*Z\+){1000}/,
	'crossbuf superlong match 4 (1 byte search pattern)');

SKIP: {
skip 'long tests', 8 unless $ENV{TEST_NGINX_UNSAFE};

like(http_get('/shortbuf/match1?a=' . 'abpatternyzA' x 3),
	qr/(\+A){3}/, 'shortbuf match 1.1');
like(http_get('/shortbuf/match1?a=' . 'abpatternyzABCD' x 3),
	qr/(\+ABCD){3}/, 'shortbuf match 1.2');
like(http_get('/shortbuf/match1?a=' . 'abpatternyzABCDE' x 3),
	qr/(\+ABCDE){3}/, 'shortbuf match 1.3');
like(http_get('/shortbuf/match2?a=' . 'abpatternyzAabpaernyzB' x 2),
	qr/(\+A-B){2}/, 'shortbuf match 2.1 (multiple replace)');
like(http_get('/shortbuf/match2?a=' . 'abpatternyzAabpaernyz' x 2),
	qr/(\+A-){2}/, 'shortbuf match 2.2 (multiple replace)');
like(http_get('/shortbuf/match3?a=' . 'abpatternyzA_' x 3),
	qr/(\+A\*){3}/, 'shortbuf match 3 (1 byte search pattern)');
like(http_get('/shortbuf/match4?a=' . 'pattABCDEFGHI' x 3),
	qr/(\+ABCDEFGHI){3}/, 'shortbuf match 4');
like(http_get('/shortbuf/match5?a=abpatternyzABCDE' . 'abpatternyABCDE' x 2),
	qr/\+ABCDE(-\*nyABCDE){2}/, 'shortbuf match 5');
}

###############################################################################