xref: /unit/test/test_routing.py (revision 1596)
11475Saxel.duch@nginx.com# -*- coding: utf-8 -*-
2*1596Szelenkov@nginx.comimport pytest
31475Saxel.duch@nginx.com
41019Szelenkov@nginx.comfrom unit.applications.proto import TestApplicationProto
5*1596Szelenkov@nginx.comfrom conftest import option, skip_alert
6972Szelenkov@nginx.com
71017Szelenkov@nginx.com
81019Szelenkov@nginx.comclass TestRouting(TestApplicationProto):
91467Szelenkov@nginx.com    prerequisites = {'modules': {'python': 'any'}}
10972Szelenkov@nginx.com
11*1596Szelenkov@nginx.com    def setup_method(self):
12*1596Szelenkov@nginx.com        super().setup_method()
13972Szelenkov@nginx.com
14*1596Szelenkov@nginx.com        assert 'success' in self.conf(
15*1596Szelenkov@nginx.com            {
16*1596Szelenkov@nginx.com                "listeners": {"*:7080": {"pass": "routes"}},
17*1596Szelenkov@nginx.com                "routes": [
18*1596Szelenkov@nginx.com                    {"match": {"method": "GET"}, "action": {"return": 200},}
19*1596Szelenkov@nginx.com                ],
20*1596Szelenkov@nginx.com                "applications": {},
21*1596Szelenkov@nginx.com            }
22*1596Szelenkov@nginx.com        ), 'routing configure'
23972Szelenkov@nginx.com
241101Szelenkov@nginx.com    def route(self, route):
251101Szelenkov@nginx.com        return self.conf([route], 'routes')
261101Szelenkov@nginx.com
271308Szelenkov@nginx.com    def route_match(self, match):
28*1596Szelenkov@nginx.com        assert 'success' in self.route(
29*1596Szelenkov@nginx.com            {"match": match, "action": {"return": 200}}
30*1596Szelenkov@nginx.com        ), 'route match configure'
311037Szelenkov@nginx.com
321308Szelenkov@nginx.com    def route_match_invalid(self, match):
33*1596Szelenkov@nginx.com        assert 'error' in self.route(
34*1596Szelenkov@nginx.com            {"match": match, "action": {"return": 200}}
35*1596Szelenkov@nginx.com        ), 'route match configure invalid'
361037Szelenkov@nginx.com
371308Szelenkov@nginx.com    def host(self, host, status):
38*1596Szelenkov@nginx.com        assert (
39*1596Szelenkov@nginx.com            self.get(headers={'Host': host, 'Connection': 'close'})['status']
40*1596Szelenkov@nginx.com            == status
41*1596Szelenkov@nginx.com        ), 'match host'
421308Szelenkov@nginx.com
431308Szelenkov@nginx.com    def cookie(self, cookie, status):
44*1596Szelenkov@nginx.com        assert (
451308Szelenkov@nginx.com            self.get(
461308Szelenkov@nginx.com                headers={
471308Szelenkov@nginx.com                    'Host': 'localhost',
481308Szelenkov@nginx.com                    'Cookie': cookie,
491308Szelenkov@nginx.com                    'Connection': 'close',
501308Szelenkov@nginx.com                },
51*1596Szelenkov@nginx.com            )['status']
52*1596Szelenkov@nginx.com            == status
53*1596Szelenkov@nginx.com        ), 'match cookie'
541037Szelenkov@nginx.com
551308Szelenkov@nginx.com    def test_routes_match_method_positive(self):
56*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'GET'
57*1596Szelenkov@nginx.com        assert self.post()['status'] == 404, 'POST'
581308Szelenkov@nginx.com
591308Szelenkov@nginx.com    def test_routes_match_method_positive_many(self):
601308Szelenkov@nginx.com        self.route_match({"method": ["GET", "POST"]})
611308Szelenkov@nginx.com
62*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'GET'
63*1596Szelenkov@nginx.com        assert self.post()['status'] == 200, 'POST'
64*1596Szelenkov@nginx.com        assert self.delete()['status'] == 404, 'DELETE'
651308Szelenkov@nginx.com
661308Szelenkov@nginx.com    def test_routes_match_method_negative(self):
671308Szelenkov@nginx.com        self.route_match({"method": "!GET"})
681308Szelenkov@nginx.com
69*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'GET'
70*1596Szelenkov@nginx.com        assert self.post()['status'] == 200, 'POST'
711308Szelenkov@nginx.com
721308Szelenkov@nginx.com    def test_routes_match_method_negative_many(self):
731308Szelenkov@nginx.com        self.route_match({"method": ["!GET", "!POST"]})
741308Szelenkov@nginx.com
75*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'GET'
76*1596Szelenkov@nginx.com        assert self.post()['status'] == 404, 'POST'
77*1596Szelenkov@nginx.com        assert self.delete()['status'] == 200, 'DELETE'
781308Szelenkov@nginx.com
791308Szelenkov@nginx.com    def test_routes_match_method_wildcard_left(self):
801308Szelenkov@nginx.com        self.route_match({"method": "*ET"})
811308Szelenkov@nginx.com
82*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'GET'
83*1596Szelenkov@nginx.com        assert self.post()['status'] == 404, 'POST'
841037Szelenkov@nginx.com
851308Szelenkov@nginx.com    def test_routes_match_method_wildcard_right(self):
861308Szelenkov@nginx.com        self.route_match({"method": "GE*"})
871308Szelenkov@nginx.com
88*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'GET'
89*1596Szelenkov@nginx.com        assert self.post()['status'] == 404, 'POST'
901308Szelenkov@nginx.com
911308Szelenkov@nginx.com    def test_routes_match_method_wildcard_left_right(self):
921308Szelenkov@nginx.com        self.route_match({"method": "*GET*"})
931308Szelenkov@nginx.com
94*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'GET'
95*1596Szelenkov@nginx.com        assert self.post()['status'] == 404, 'POST'
961308Szelenkov@nginx.com
971308Szelenkov@nginx.com    def test_routes_match_method_wildcard(self):
981308Szelenkov@nginx.com        self.route_match({"method": "*"})
991308Szelenkov@nginx.com
100*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'GET'
1011308Szelenkov@nginx.com
1021308Szelenkov@nginx.com    def test_routes_match_invalid(self):
1031308Szelenkov@nginx.com        self.route_match_invalid({"method": "**"})
1041508Saxel.duch@nginx.com
1051508Saxel.duch@nginx.com    def test_routes_match_valid(self):
1061508Saxel.duch@nginx.com        self.route_match({"method": "blah*"})
1071508Saxel.duch@nginx.com        self.route_match({"host": "*blah*blah"})
1081508Saxel.duch@nginx.com        self.route_match({"host": "blah*blah*blah"})
1091508Saxel.duch@nginx.com        self.route_match({"host": "blah*blah*"})
1101508Saxel.duch@nginx.com
1111508Saxel.duch@nginx.com    def test_routes_match_empty_exact(self):
1121508Saxel.duch@nginx.com        self.route_match({"uri": ""})
113*1596Szelenkov@nginx.com        assert self.get()['status'] == 404
1141508Saxel.duch@nginx.com
1151508Saxel.duch@nginx.com        self.route_match({"uri": "/"})
116*1596Szelenkov@nginx.com        assert self.get()['status'] == 200
117*1596Szelenkov@nginx.com        assert self.get(url='/blah')['status'] == 404
1181508Saxel.duch@nginx.com
1191508Saxel.duch@nginx.com    def test_routes_match_negative(self):
1201508Saxel.duch@nginx.com        self.route_match({"uri": "!"})
121*1596Szelenkov@nginx.com        assert self.get()['status'] == 404
1221508Saxel.duch@nginx.com
1231508Saxel.duch@nginx.com        self.route_match({"uri": "!/"})
124*1596Szelenkov@nginx.com        assert self.get()['status'] == 404
125*1596Szelenkov@nginx.com        assert self.get(url='/blah')['status'] == 200
1261508Saxel.duch@nginx.com
1271508Saxel.duch@nginx.com        self.route_match({"uri": "!*blah"})
128*1596Szelenkov@nginx.com        assert self.get()['status'] == 200
129*1596Szelenkov@nginx.com        assert self.get(url='/bla')['status'] == 200
130*1596Szelenkov@nginx.com        assert self.get(url='/blah')['status'] == 404
131*1596Szelenkov@nginx.com        assert self.get(url='/blah1')['status'] == 200
1321508Saxel.duch@nginx.com
1331508Saxel.duch@nginx.com        self.route_match({"uri": "!/blah*1*"})
134*1596Szelenkov@nginx.com        assert self.get()['status'] == 200
135*1596Szelenkov@nginx.com        assert self.get(url='/blah')['status'] == 200
136*1596Szelenkov@nginx.com        assert self.get(url='/blah1')['status'] == 404
137*1596Szelenkov@nginx.com        assert self.get(url='/blah12')['status'] == 404
138*1596Szelenkov@nginx.com        assert self.get(url='/blah2')['status'] == 200
1391308Szelenkov@nginx.com
1401308Szelenkov@nginx.com    def test_routes_match_wildcard_middle(self):
1411308Szelenkov@nginx.com        self.route_match({"host": "ex*le"})
1421308Szelenkov@nginx.com
1431308Szelenkov@nginx.com        self.host('example', 200)
1441308Szelenkov@nginx.com        self.host('www.example', 404)
1451308Szelenkov@nginx.com        self.host('example.com', 404)
1461308Szelenkov@nginx.com        self.host('exampl', 404)
1471037Szelenkov@nginx.com
148972Szelenkov@nginx.com    def test_routes_match_method_case_insensitive(self):
1491308Szelenkov@nginx.com        self.route_match({"method": "get"})
150972Szelenkov@nginx.com
151*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'GET'
152972Szelenkov@nginx.com
1531037Szelenkov@nginx.com    def test_routes_match_wildcard_left_case_insensitive(self):
1541308Szelenkov@nginx.com        self.route_match({"method": "*get"})
155*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'GET'
1561037Szelenkov@nginx.com
1571308Szelenkov@nginx.com        self.route_match({"method": "*et"})
158*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'GET'
1591037Szelenkov@nginx.com
1601037Szelenkov@nginx.com    def test_routes_match_wildcard_middle_case_insensitive(self):
1611308Szelenkov@nginx.com        self.route_match({"method": "g*t"})
1621037Szelenkov@nginx.com
163*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'GET'
1641037Szelenkov@nginx.com
1651037Szelenkov@nginx.com    def test_routes_match_wildcard_right_case_insensitive(self):
1661308Szelenkov@nginx.com        self.route_match({"method": "get*"})
167*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'GET'
1681037Szelenkov@nginx.com
1691308Szelenkov@nginx.com        self.route_match({"method": "ge*"})
170*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'GET'
1711037Szelenkov@nginx.com
1721037Szelenkov@nginx.com    def test_routes_match_wildcard_substring_case_insensitive(self):
1731308Szelenkov@nginx.com        self.route_match({"method": "*et*"})
1741037Szelenkov@nginx.com
175*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'GET'
1761037Szelenkov@nginx.com
1771037Szelenkov@nginx.com    def test_routes_match_wildcard_left_case_sensitive(self):
1781308Szelenkov@nginx.com        self.route_match({"uri": "*blah"})
1791037Szelenkov@nginx.com
180*1596Szelenkov@nginx.com        assert self.get(url='/blah')['status'] == 200, '/blah'
181*1596Szelenkov@nginx.com        assert self.get(url='/BLAH')['status'] == 404, '/BLAH'
1821037Szelenkov@nginx.com
1831037Szelenkov@nginx.com    def test_routes_match_wildcard_middle_case_sensitive(self):
1841308Szelenkov@nginx.com        self.route_match({"uri": "/b*h"})
1851037Szelenkov@nginx.com
186*1596Szelenkov@nginx.com        assert self.get(url='/blah')['status'] == 200, '/blah'
187*1596Szelenkov@nginx.com        assert self.get(url='/BLAH')['status'] == 404, '/BLAH'
1881037Szelenkov@nginx.com
1891510Saxel.duch@nginx.com    def test_route_match_wildcards_ordered(self):
1901510Saxel.duch@nginx.com        self.route_match({"uri": "/a*x*y*"})
1911510Saxel.duch@nginx.com
192*1596Szelenkov@nginx.com        assert self.get(url='/axy')['status'] == 200, '/axy'
193*1596Szelenkov@nginx.com        assert self.get(url='/ayx')['status'] == 404, '/ayx'
1941510Saxel.duch@nginx.com
1951510Saxel.duch@nginx.com    def test_route_match_wildcards_adjust_start(self):
1961510Saxel.duch@nginx.com        self.route_match({"uri": "/bla*bla*"})
1971510Saxel.duch@nginx.com
198*1596Szelenkov@nginx.com        assert self.get(url='/bla_foo')['status'] == 404, '/bla_foo'
1991510Saxel.duch@nginx.com
2001510Saxel.duch@nginx.com    def test_route_match_wildcards_adjust_start_substr(self):
2011510Saxel.duch@nginx.com        self.route_match({"uri": "*bla*bla*"})
2021510Saxel.duch@nginx.com
203*1596Szelenkov@nginx.com        assert self.get(url='/bla_foo')['status'] == 404, '/bla_foo'
2041510Saxel.duch@nginx.com
2051510Saxel.duch@nginx.com    def test_route_match_wildcards_adjust_end(self):
2061510Saxel.duch@nginx.com        self.route_match({"uri": "/bla*bla"})
2071510Saxel.duch@nginx.com
208*1596Szelenkov@nginx.com        assert self.get(url='/foo_bla')['status'] == 404, '/foo_bla'
2091510Saxel.duch@nginx.com
2101037Szelenkov@nginx.com    def test_routes_match_wildcard_right_case_sensitive(self):
2111308Szelenkov@nginx.com        self.route_match({"uri": "/bla*"})
2121037Szelenkov@nginx.com
213*1596Szelenkov@nginx.com        assert self.get(url='/blah')['status'] == 200, '/blah'
214*1596Szelenkov@nginx.com        assert self.get(url='/BLAH')['status'] == 404, '/BLAH'
2151037Szelenkov@nginx.com
2161037Szelenkov@nginx.com    def test_routes_match_wildcard_substring_case_sensitive(self):
2171308Szelenkov@nginx.com        self.route_match({"uri": "*bla*"})
2181037Szelenkov@nginx.com
219*1596Szelenkov@nginx.com        assert self.get(url='/blah')['status'] == 200, '/blah'
220*1596Szelenkov@nginx.com        assert self.get(url='/BLAH')['status'] == 404, '/BLAH'
2211037Szelenkov@nginx.com
2221508Saxel.duch@nginx.com    def test_routes_match_many_wildcard_substrings_case_sensitive(self):
2231508Saxel.duch@nginx.com        self.route_match({"uri": "*a*B*c*"})
2241508Saxel.duch@nginx.com
225*1596Szelenkov@nginx.com        assert self.get(url='/blah-a-B-c-blah')['status'] == 200
226*1596Szelenkov@nginx.com        assert self.get(url='/a-B-c')['status'] == 200
227*1596Szelenkov@nginx.com        assert self.get(url='/aBc')['status'] == 200
228*1596Szelenkov@nginx.com        assert self.get(url='/aBCaBbc')['status'] == 200
229*1596Szelenkov@nginx.com        assert self.get(url='/ABc')['status'] == 404
2301508Saxel.duch@nginx.com
2311478Szelenkov@nginx.com    def test_routes_pass_encode(self):
2321478Szelenkov@nginx.com        def check_pass(path, name):
233*1596Szelenkov@nginx.com            assert 'success' in self.conf(
234*1596Szelenkov@nginx.com                {
235*1596Szelenkov@nginx.com                    "listeners": {"*:7080": {"pass": "applications/" + path}},
236*1596Szelenkov@nginx.com                    "applications": {
237*1596Szelenkov@nginx.com                        name: {
238*1596Szelenkov@nginx.com                            "type": "python",
239*1596Szelenkov@nginx.com                            "processes": {"spare": 0},
240*1596Szelenkov@nginx.com                            "path": option.test_dir + '/python/empty',
241*1596Szelenkov@nginx.com                            "working_directory": option.test_dir
242*1596Szelenkov@nginx.com                            + '/python/empty',
243*1596Szelenkov@nginx.com                            "module": "wsgi",
244*1596Szelenkov@nginx.com                        }
245*1596Szelenkov@nginx.com                    },
246*1596Szelenkov@nginx.com                }
2471478Szelenkov@nginx.com            )
2481478Szelenkov@nginx.com
249*1596Szelenkov@nginx.com            assert self.get()['status'] == 200
2501478Szelenkov@nginx.com
2511478Szelenkov@nginx.com        check_pass("%25", "%")
2521478Szelenkov@nginx.com        check_pass("blah%2Fblah", "blah/blah")
2531478Szelenkov@nginx.com        check_pass("%2Fblah%2F%2Fblah%2F", "/blah//blah/")
2541478Szelenkov@nginx.com        check_pass("%20blah%252Fblah%7E", " blah%2Fblah~")
2551478Szelenkov@nginx.com
2561478Szelenkov@nginx.com        def check_pass_error(path, name):
257*1596Szelenkov@nginx.com            assert 'error' in self.conf(
258*1596Szelenkov@nginx.com                {
259*1596Szelenkov@nginx.com                    "listeners": {"*:7080": {"pass": "applications/" + path}},
260*1596Szelenkov@nginx.com                    "applications": {
261*1596Szelenkov@nginx.com                        name: {
262*1596Szelenkov@nginx.com                            "type": "python",
263*1596Szelenkov@nginx.com                            "processes": {"spare": 0},
264*1596Szelenkov@nginx.com                            "path": option.test_dir + '/python/empty',
265*1596Szelenkov@nginx.com                            "working_directory": option.test_dir
266*1596Szelenkov@nginx.com                            + '/python/empty',
267*1596Szelenkov@nginx.com                            "module": "wsgi",
268*1596Szelenkov@nginx.com                        }
269*1596Szelenkov@nginx.com                    },
270*1596Szelenkov@nginx.com                }
2711478Szelenkov@nginx.com            )
2721478Szelenkov@nginx.com
2731478Szelenkov@nginx.com        check_pass_error("%", "%")
2741478Szelenkov@nginx.com        check_pass_error("%1", "%1")
2751478Szelenkov@nginx.com
276972Szelenkov@nginx.com    def test_routes_absent(self):
2771017Szelenkov@nginx.com        self.conf(
2781017Szelenkov@nginx.com            {
2791017Szelenkov@nginx.com                "listeners": {"*:7081": {"pass": "applications/empty"}},
2801017Szelenkov@nginx.com                "applications": {
2811017Szelenkov@nginx.com                    "empty": {
2821017Szelenkov@nginx.com                        "type": "python",
2831017Szelenkov@nginx.com                        "processes": {"spare": 0},
284*1596Szelenkov@nginx.com                        "path": option.test_dir + '/python/empty',
285*1596Szelenkov@nginx.com                        "working_directory": option.test_dir
2861017Szelenkov@nginx.com                        + '/python/empty',
2871017Szelenkov@nginx.com                        "module": "wsgi",
2881017Szelenkov@nginx.com                    }
2891017Szelenkov@nginx.com                },
290972Szelenkov@nginx.com            }
2911017Szelenkov@nginx.com        )
292972Szelenkov@nginx.com
293*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 200, 'routes absent'
294972Szelenkov@nginx.com
295972Szelenkov@nginx.com    def test_routes_pass_invalid(self):
296*1596Szelenkov@nginx.com        assert 'error' in self.conf(
297*1596Szelenkov@nginx.com            {"pass": "routes/blah"}, 'listeners/*:7080'
298*1596Szelenkov@nginx.com        ), 'routes invalid'
299972Szelenkov@nginx.com
300972Szelenkov@nginx.com    def test_route_empty(self):
301*1596Szelenkov@nginx.com        assert 'success' in self.conf(
302*1596Szelenkov@nginx.com            {
303*1596Szelenkov@nginx.com                "listeners": {"*:7080": {"pass": "routes/main"}},
304*1596Szelenkov@nginx.com                "routes": {"main": []},
305*1596Szelenkov@nginx.com                "applications": {},
306*1596Szelenkov@nginx.com            }
307*1596Szelenkov@nginx.com        ), 'route empty configure'
308972Szelenkov@nginx.com
309*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'route empty'
310972Szelenkov@nginx.com
311972Szelenkov@nginx.com    def test_routes_route_empty(self):
312*1596Szelenkov@nginx.com        assert 'success' in self.conf(
313*1596Szelenkov@nginx.com            {}, 'listeners'
314*1596Szelenkov@nginx.com        ), 'routes empty listeners configure'
315972Szelenkov@nginx.com
316*1596Szelenkov@nginx.com        assert 'success' in self.conf({}, 'routes'), 'routes empty configure'
317972Szelenkov@nginx.com
318972Szelenkov@nginx.com    def test_routes_route_match_absent(self):
319*1596Szelenkov@nginx.com        assert 'success' in self.conf(
320*1596Szelenkov@nginx.com            [{"action": {"return": 200}}], 'routes'
321*1596Szelenkov@nginx.com        ), 'route match absent configure'
322972Szelenkov@nginx.com
323*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'route match absent'
324972Szelenkov@nginx.com
325972Szelenkov@nginx.com    def test_routes_route_action_absent(self):
326*1596Szelenkov@nginx.com        skip_alert(r'failed to apply new conf')
327972Szelenkov@nginx.com
328*1596Szelenkov@nginx.com        assert 'error' in self.conf(
329*1596Szelenkov@nginx.com            [{"match": {"method": "GET"}}], 'routes'
330*1596Szelenkov@nginx.com        ), 'route pass absent configure'
331972Szelenkov@nginx.com
332972Szelenkov@nginx.com    def test_routes_route_pass_absent(self):
333*1596Szelenkov@nginx.com        assert 'error' in self.conf(
334*1596Szelenkov@nginx.com            [{"match": {"method": "GET"}, "action": {}}], 'routes'
335*1596Szelenkov@nginx.com        ), 'route pass absent configure'
336972Szelenkov@nginx.com
3371379Szelenkov@nginx.com    def test_routes_action_unique(self):
338*1596Szelenkov@nginx.com        assert 'success' in self.conf(
339*1596Szelenkov@nginx.com            {
340*1596Szelenkov@nginx.com                "listeners": {
341*1596Szelenkov@nginx.com                    "*:7080": {"pass": "routes"},
342*1596Szelenkov@nginx.com                    "*:7081": {"pass": "applications/app"},
343*1596Szelenkov@nginx.com                },
344*1596Szelenkov@nginx.com                "routes": [{"action": {"proxy": "http://127.0.0.1:7081"}}],
345*1596Szelenkov@nginx.com                "applications": {
346*1596Szelenkov@nginx.com                    "app": {
347*1596Szelenkov@nginx.com                        "type": "python",
348*1596Szelenkov@nginx.com                        "processes": {"spare": 0},
349*1596Szelenkov@nginx.com                        "path": "/app",
350*1596Szelenkov@nginx.com                        "module": "wsgi",
351*1596Szelenkov@nginx.com                    }
352*1596Szelenkov@nginx.com                },
353*1596Szelenkov@nginx.com            }
3541379Szelenkov@nginx.com        )
3551379Szelenkov@nginx.com
356*1596Szelenkov@nginx.com        assert 'error' in self.conf(
357*1596Szelenkov@nginx.com            {"proxy": "http://127.0.0.1:7081", "share": self.temp_dir},
358*1596Szelenkov@nginx.com            'routes/0/action',
359*1596Szelenkov@nginx.com        ), 'proxy share'
360*1596Szelenkov@nginx.com        assert 'error' in self.conf(
361*1596Szelenkov@nginx.com            {"proxy": "http://127.0.0.1:7081", "pass": "applications/app",},
362*1596Szelenkov@nginx.com            'routes/0/action',
363*1596Szelenkov@nginx.com        ), 'proxy pass'
364*1596Szelenkov@nginx.com        assert 'error' in self.conf(
365*1596Szelenkov@nginx.com            {"share": self.temp_dir, "pass": "applications/app"},
366*1596Szelenkov@nginx.com            'routes/0/action',
367*1596Szelenkov@nginx.com        ), 'share pass'
3681379Szelenkov@nginx.com
369972Szelenkov@nginx.com    def test_routes_rules_two(self):
370*1596Szelenkov@nginx.com        assert 'success' in self.conf(
371*1596Szelenkov@nginx.com            [
372*1596Szelenkov@nginx.com                {"match": {"method": "GET"}, "action": {"return": 200}},
373*1596Szelenkov@nginx.com                {"match": {"method": "POST"}, "action": {"return": 201}},
374*1596Szelenkov@nginx.com            ],
375*1596Szelenkov@nginx.com            'routes',
376*1596Szelenkov@nginx.com        ), 'rules two configure'
377972Szelenkov@nginx.com
378*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'rules two match first'
379*1596Szelenkov@nginx.com        assert self.post()['status'] == 201, 'rules two match second'
380972Szelenkov@nginx.com
381972Szelenkov@nginx.com    def test_routes_two(self):
382*1596Szelenkov@nginx.com        assert 'success' in self.conf(
383*1596Szelenkov@nginx.com            {
384*1596Szelenkov@nginx.com                "listeners": {"*:7080": {"pass": "routes/first"}},
385*1596Szelenkov@nginx.com                "routes": {
386*1596Szelenkov@nginx.com                    "first": [
387*1596Szelenkov@nginx.com                        {
388*1596Szelenkov@nginx.com                            "match": {"method": "GET"},
389*1596Szelenkov@nginx.com                            "action": {"pass": "routes/second"},
390*1596Szelenkov@nginx.com                        }
391*1596Szelenkov@nginx.com                    ],
392*1596Szelenkov@nginx.com                    "second": [
393*1596Szelenkov@nginx.com                        {
394*1596Szelenkov@nginx.com                            "match": {"host": "localhost"},
395*1596Szelenkov@nginx.com                            "action": {"return": 200},
396*1596Szelenkov@nginx.com                        }
397*1596Szelenkov@nginx.com                    ],
398*1596Szelenkov@nginx.com                },
399*1596Szelenkov@nginx.com                "applications": {},
400*1596Szelenkov@nginx.com            }
401*1596Szelenkov@nginx.com        ), 'routes two configure'
402972Szelenkov@nginx.com
403*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'routes two'
404972Szelenkov@nginx.com
405972Szelenkov@nginx.com    def test_routes_match_host_positive(self):
4061308Szelenkov@nginx.com        self.route_match({"host": "localhost"})
407972Szelenkov@nginx.com
408*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'localhost'
4091308Szelenkov@nginx.com        self.host('localhost.', 200)
4101308Szelenkov@nginx.com        self.host('localhost.', 200)
4111308Szelenkov@nginx.com        self.host('.localhost', 404)
4121308Szelenkov@nginx.com        self.host('www.localhost', 404)
4131308Szelenkov@nginx.com        self.host('localhost1', 404)
414972Szelenkov@nginx.com
415*1596Szelenkov@nginx.com    @pytest.mark.skip('not yet')
4161065Szelenkov@nginx.com    def test_routes_match_host_absent(self):
4171308Szelenkov@nginx.com        self.route_match({"host": "localhost"})
4181065Szelenkov@nginx.com
419*1596Szelenkov@nginx.com        assert (
420*1596Szelenkov@nginx.com            self.get(headers={'Connection': 'close'})['status'] == 400
421*1596Szelenkov@nginx.com        ), 'match host absent'
4221065Szelenkov@nginx.com
423972Szelenkov@nginx.com    def test_routes_match_host_ipv4(self):
4241308Szelenkov@nginx.com        self.route_match({"host": "127.0.0.1"})
425972Szelenkov@nginx.com
4261308Szelenkov@nginx.com        self.host('127.0.0.1', 200)
4271308Szelenkov@nginx.com        self.host('127.0.0.1:7080', 200)
428972Szelenkov@nginx.com
429972Szelenkov@nginx.com    def test_routes_match_host_ipv6(self):
4301308Szelenkov@nginx.com        self.route_match({"host": "[::1]"})
431972Szelenkov@nginx.com
4321308Szelenkov@nginx.com        self.host('[::1]', 200)
4331308Szelenkov@nginx.com        self.host('[::1]:7080', 200)
434972Szelenkov@nginx.com
435972Szelenkov@nginx.com    def test_routes_match_host_positive_many(self):
4361308Szelenkov@nginx.com        self.route_match({"host": ["localhost", "example.com"]})
437972Szelenkov@nginx.com
438*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'localhost'
4391308Szelenkov@nginx.com        self.host('example.com', 200)
440972Szelenkov@nginx.com
441972Szelenkov@nginx.com    def test_routes_match_host_positive_and_negative(self):
4421308Szelenkov@nginx.com        self.route_match({"host": ["*example.com", "!www.example.com"]})
443972Szelenkov@nginx.com
444*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'localhost'
4451308Szelenkov@nginx.com        self.host('example.com', 200)
4461308Szelenkov@nginx.com        self.host('www.example.com', 404)
4471308Szelenkov@nginx.com        self.host('!www.example.com', 200)
448972Szelenkov@nginx.com
449972Szelenkov@nginx.com    def test_routes_match_host_positive_and_negative_wildcard(self):
4501308Szelenkov@nginx.com        self.route_match({"host": ["*example*", "!www.example*"]})
451972Szelenkov@nginx.com
4521308Szelenkov@nginx.com        self.host('example.com', 200)
4531308Szelenkov@nginx.com        self.host('www.example.com', 404)
454972Szelenkov@nginx.com
455972Szelenkov@nginx.com    def test_routes_match_host_case_insensitive(self):
4561308Szelenkov@nginx.com        self.route_match({"host": "Example.com"})
457972Szelenkov@nginx.com
4581308Szelenkov@nginx.com        self.host('example.com', 200)
4591308Szelenkov@nginx.com        self.host('EXAMPLE.COM', 200)
460972Szelenkov@nginx.com
461972Szelenkov@nginx.com    def test_routes_match_host_port(self):
4621308Szelenkov@nginx.com        self.route_match({"host": "example.com"})
463972Szelenkov@nginx.com
4641308Szelenkov@nginx.com        self.host('example.com:7080', 200)
465972Szelenkov@nginx.com
4661053Szelenkov@nginx.com    def test_routes_match_host_empty(self):
4671308Szelenkov@nginx.com        self.route_match({"host": ""})
4681053Szelenkov@nginx.com
4691308Szelenkov@nginx.com        self.host('', 200)
470*1596Szelenkov@nginx.com        assert (
471*1596Szelenkov@nginx.com            self.get(http_10=True, headers={})['status'] == 200
472*1596Szelenkov@nginx.com        ), 'match host empty 2'
473*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'match host empty 3'
4741053Szelenkov@nginx.com
475972Szelenkov@nginx.com    def test_routes_match_uri_positive(self):
4761308Szelenkov@nginx.com        self.route_match({"uri": ["/blah", "/slash/"]})
477972Szelenkov@nginx.com
478*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, '/'
479*1596Szelenkov@nginx.com        assert self.get(url='/blah')['status'] == 200, '/blah'
480*1596Szelenkov@nginx.com        assert self.get(url='/blah#foo')['status'] == 200, '/blah#foo'
481*1596Szelenkov@nginx.com        assert self.get(url='/blah?var')['status'] == 200, '/blah?var'
482*1596Szelenkov@nginx.com        assert self.get(url='//blah')['status'] == 200, '//blah'
483*1596Szelenkov@nginx.com        assert self.get(url='/slash/foo/../')['status'] == 200, 'relative'
484*1596Szelenkov@nginx.com        assert self.get(url='/slash/./')['status'] == 200, '/slash/./'
485*1596Szelenkov@nginx.com        assert self.get(url='/slash//.//')['status'] == 200, 'adjacent slashes'
486*1596Szelenkov@nginx.com        assert self.get(url='/%')['status'] == 400, 'percent'
487*1596Szelenkov@nginx.com        assert self.get(url='/%1')['status'] == 400, 'percent digit'
488*1596Szelenkov@nginx.com        assert self.get(url='/%A')['status'] == 400, 'percent letter'
489*1596Szelenkov@nginx.com        assert self.get(url='/slash/.?args')['status'] == 200, 'dot args'
490*1596Szelenkov@nginx.com        assert self.get(url='/slash/.#frag')['status'] == 200, 'dot frag'
491*1596Szelenkov@nginx.com        assert (
492*1596Szelenkov@nginx.com            self.get(url='/slash/foo/..?args')['status'] == 200
493*1596Szelenkov@nginx.com        ), 'dot dot args'
494*1596Szelenkov@nginx.com        assert (
495*1596Szelenkov@nginx.com            self.get(url='/slash/foo/..#frag')['status'] == 200
496*1596Szelenkov@nginx.com        ), 'dot dot frag'
497*1596Szelenkov@nginx.com        assert self.get(url='/slash/.')['status'] == 200, 'trailing dot'
498*1596Szelenkov@nginx.com        assert (
499*1596Szelenkov@nginx.com            self.get(url='/slash/foo/..')['status'] == 200
500*1596Szelenkov@nginx.com        ), 'trailing dot dot'
501972Szelenkov@nginx.com
502972Szelenkov@nginx.com    def test_routes_match_uri_case_sensitive(self):
5031308Szelenkov@nginx.com        self.route_match({"uri": "/BLAH"})
5041308Szelenkov@nginx.com
505*1596Szelenkov@nginx.com        assert self.get(url='/blah')['status'] == 404, '/blah'
506*1596Szelenkov@nginx.com        assert self.get(url='/BlaH')['status'] == 404, '/BlaH'
507*1596Szelenkov@nginx.com        assert self.get(url='/BLAH')['status'] == 200, '/BLAH'
5081308Szelenkov@nginx.com
5091308Szelenkov@nginx.com    def test_routes_match_uri_normalize(self):
5101308Szelenkov@nginx.com        self.route_match({"uri": "/blah"})
511972Szelenkov@nginx.com
512*1596Szelenkov@nginx.com        assert self.get(url='/%62%6c%61%68')['status'] == 200, 'normalize'
513972Szelenkov@nginx.com
5141053Szelenkov@nginx.com    def test_routes_match_empty_array(self):
5151308Szelenkov@nginx.com        self.route_match({"uri": []})
5161053Szelenkov@nginx.com
517*1596Szelenkov@nginx.com        assert self.get(url='/blah')['status'] == 200, 'empty array'
5181053Szelenkov@nginx.com
5191053Szelenkov@nginx.com    def test_routes_reconfigure(self):
520*1596Szelenkov@nginx.com        assert 'success' in self.conf([], 'routes'), 'redefine'
521*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'redefine request'
5221053Szelenkov@nginx.com
523*1596Szelenkov@nginx.com        assert 'success' in self.conf(
524*1596Szelenkov@nginx.com            [{"action": {"return": 200}}], 'routes'
525*1596Szelenkov@nginx.com        ), 'redefine 2'
526*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'redefine request 2'
527*1596Szelenkov@nginx.com
528*1596Szelenkov@nginx.com        assert 'success' in self.conf([], 'routes'), 'redefine 3'
529*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'redefine request 3'
5301053Szelenkov@nginx.com
531*1596Szelenkov@nginx.com        assert 'success' in self.conf(
532*1596Szelenkov@nginx.com            {
533*1596Szelenkov@nginx.com                "listeners": {"*:7080": {"pass": "routes/main"}},
534*1596Szelenkov@nginx.com                "routes": {"main": [{"action": {"return": 200}}]},
535*1596Szelenkov@nginx.com                "applications": {},
536*1596Szelenkov@nginx.com            }
537*1596Szelenkov@nginx.com        ), 'redefine 4'
538*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'redefine request 4'
5391053Szelenkov@nginx.com
540*1596Szelenkov@nginx.com        assert 'success' in self.conf_delete('routes/main/0'), 'redefine 5'
541*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'redefine request 5'
5421053Szelenkov@nginx.com
543*1596Szelenkov@nginx.com        assert 'success' in self.conf_post(
544*1596Szelenkov@nginx.com            {"action": {"return": 200}}, 'routes/main'
545*1596Szelenkov@nginx.com        ), 'redefine 6'
546*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'redefine request 6'
5471063Szelenkov@nginx.com
548*1596Szelenkov@nginx.com        assert 'error' in self.conf(
549*1596Szelenkov@nginx.com            {"action": {"return": 200}}, 'routes/main/2'
550*1596Szelenkov@nginx.com        ), 'redefine 7'
551*1596Szelenkov@nginx.com        assert 'success' in self.conf(
552*1596Szelenkov@nginx.com            {"action": {"return": 201}}, 'routes/main/1'
553*1596Szelenkov@nginx.com        ), 'redefine 8'
554*1596Szelenkov@nginx.com
555*1596Szelenkov@nginx.com        assert len(self.conf_get('routes/main')) == 2, 'redefine conf 8'
556*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'redefine request 8'
5571063Szelenkov@nginx.com
5581053Szelenkov@nginx.com    def test_routes_edit(self):
5591308Szelenkov@nginx.com        self.route_match({"method": "GET"})
5601053Szelenkov@nginx.com
561*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'routes edit GET'
562*1596Szelenkov@nginx.com        assert self.post()['status'] == 404, 'routes edit POST'
5631053Szelenkov@nginx.com
564*1596Szelenkov@nginx.com        assert 'success' in self.conf_post(
565*1596Szelenkov@nginx.com            {"match": {"method": "POST"}, "action": {"return": 200}}, 'routes',
566*1596Szelenkov@nginx.com        ), 'routes edit configure 2'
567*1596Szelenkov@nginx.com        assert 'GET' == self.conf_get(
568*1596Szelenkov@nginx.com            'routes/0/match/method'
569*1596Szelenkov@nginx.com        ), 'routes edit configure 2 check'
570*1596Szelenkov@nginx.com        assert 'POST' == self.conf_get(
571*1596Szelenkov@nginx.com            'routes/1/match/method'
572*1596Szelenkov@nginx.com        ), 'routes edit configure 2 check 2'
5731053Szelenkov@nginx.com
574*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'routes edit GET 2'
575*1596Szelenkov@nginx.com        assert self.post()['status'] == 200, 'routes edit POST 2'
5761053Szelenkov@nginx.com
577*1596Szelenkov@nginx.com        assert 'success' in self.conf_delete(
578*1596Szelenkov@nginx.com            'routes/0'
579*1596Szelenkov@nginx.com        ), 'routes edit configure 3'
5801053Szelenkov@nginx.com
581*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'routes edit GET 3'
582*1596Szelenkov@nginx.com        assert self.post()['status'] == 200, 'routes edit POST 3'
5831053Szelenkov@nginx.com
584*1596Szelenkov@nginx.com        assert 'error' in self.conf_delete(
585*1596Szelenkov@nginx.com            'routes/1'
586*1596Szelenkov@nginx.com        ), 'routes edit configure invalid'
587*1596Szelenkov@nginx.com        assert 'error' in self.conf_delete(
588*1596Szelenkov@nginx.com            'routes/-1'
589*1596Szelenkov@nginx.com        ), 'routes edit configure invalid 2'
590*1596Szelenkov@nginx.com        assert 'error' in self.conf_delete(
591*1596Szelenkov@nginx.com            'routes/blah'
592*1596Szelenkov@nginx.com        ), 'routes edit configure invalid 3'
5931053Szelenkov@nginx.com
594*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'routes edit GET 4'
595*1596Szelenkov@nginx.com        assert self.post()['status'] == 200, 'routes edit POST 4'
5961053Szelenkov@nginx.com
597*1596Szelenkov@nginx.com        assert 'success' in self.conf_delete(
598*1596Szelenkov@nginx.com            'routes/0'
599*1596Szelenkov@nginx.com        ), 'routes edit configure 5'
6001053Szelenkov@nginx.com
601*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'routes edit GET 5'
602*1596Szelenkov@nginx.com        assert self.post()['status'] == 404, 'routes edit POST 5'
6031053Szelenkov@nginx.com
604*1596Szelenkov@nginx.com        assert 'success' in self.conf_post(
605*1596Szelenkov@nginx.com            {"match": {"method": "POST"}, "action": {"return": 200}}, 'routes',
606*1596Szelenkov@nginx.com        ), 'routes edit configure 6'
6071053Szelenkov@nginx.com
608*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'routes edit GET 6'
609*1596Szelenkov@nginx.com        assert self.post()['status'] == 200, 'routes edit POST 6'
6101053Szelenkov@nginx.com
611*1596Szelenkov@nginx.com        assert 'success' in self.conf(
612*1596Szelenkov@nginx.com            {
613*1596Szelenkov@nginx.com                "listeners": {"*:7080": {"pass": "routes/main"}},
614*1596Szelenkov@nginx.com                "routes": {"main": [{"action": {"return": 200}}]},
615*1596Szelenkov@nginx.com                "applications": {},
616*1596Szelenkov@nginx.com            }
617*1596Szelenkov@nginx.com        ), 'route edit configure 7'
6181053Szelenkov@nginx.com
619*1596Szelenkov@nginx.com        assert 'error' in self.conf_delete(
620*1596Szelenkov@nginx.com            'routes/0'
621*1596Szelenkov@nginx.com        ), 'routes edit configure invalid 4'
622*1596Szelenkov@nginx.com        assert 'error' in self.conf_delete(
623*1596Szelenkov@nginx.com            'routes/main'
624*1596Szelenkov@nginx.com        ), 'routes edit configure invalid 5'
6251053Szelenkov@nginx.com
626*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'routes edit GET 7'
6271053Szelenkov@nginx.com
628*1596Szelenkov@nginx.com        assert 'success' in self.conf_delete(
629*1596Szelenkov@nginx.com            'listeners/*:7080'
630*1596Szelenkov@nginx.com        ), 'route edit configure 8'
631*1596Szelenkov@nginx.com        assert 'success' in self.conf_delete(
632*1596Szelenkov@nginx.com            'routes/main'
633*1596Szelenkov@nginx.com        ), 'route edit configure 9'
6341053Szelenkov@nginx.com
6351053Szelenkov@nginx.com    def test_match_edit(self):
636*1596Szelenkov@nginx.com        skip_alert(r'failed to apply new conf')
6371053Szelenkov@nginx.com
6381308Szelenkov@nginx.com        self.route_match({"method": ["GET", "POST"]})
6391053Szelenkov@nginx.com
640*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'match edit GET'
641*1596Szelenkov@nginx.com        assert self.post()['status'] == 200, 'match edit POST'
642*1596Szelenkov@nginx.com        assert self.put()['status'] == 404, 'match edit PUT'
6431053Szelenkov@nginx.com
644*1596Szelenkov@nginx.com        assert 'success' in self.conf_post(
645*1596Szelenkov@nginx.com            '\"PUT\"', 'routes/0/match/method'
646*1596Szelenkov@nginx.com        ), 'match edit configure 2'
647*1596Szelenkov@nginx.com        assert ['GET', 'POST', 'PUT'] == self.conf_get(
648*1596Szelenkov@nginx.com            'routes/0/match/method'
649*1596Szelenkov@nginx.com        ), 'match edit configure 2 check'
6501053Szelenkov@nginx.com
651*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'match edit GET 2'
652*1596Szelenkov@nginx.com        assert self.post()['status'] == 200, 'match edit POST 2'
653*1596Szelenkov@nginx.com        assert self.put()['status'] == 200, 'match edit PUT 2'
6541053Szelenkov@nginx.com
655*1596Szelenkov@nginx.com        assert 'success' in self.conf_delete(
656*1596Szelenkov@nginx.com            'routes/0/match/method/1'
657*1596Szelenkov@nginx.com        ), 'match edit configure 3'
658*1596Szelenkov@nginx.com        assert ['GET', 'PUT'] == self.conf_get(
659*1596Szelenkov@nginx.com            'routes/0/match/method'
660*1596Szelenkov@nginx.com        ), 'match edit configure 3 check'
6611053Szelenkov@nginx.com
662*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'match edit GET 3'
663*1596Szelenkov@nginx.com        assert self.post()['status'] == 404, 'match edit POST 3'
664*1596Szelenkov@nginx.com        assert self.put()['status'] == 200, 'match edit PUT 3'
6651053Szelenkov@nginx.com
666*1596Szelenkov@nginx.com        assert 'success' in self.conf_delete(
667*1596Szelenkov@nginx.com            'routes/0/match/method/1'
668*1596Szelenkov@nginx.com        ), 'match edit configure 4'
669*1596Szelenkov@nginx.com        assert ['GET'] == self.conf_get(
670*1596Szelenkov@nginx.com            'routes/0/match/method'
671*1596Szelenkov@nginx.com        ), 'match edit configure 4 check'
6721053Szelenkov@nginx.com
673*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'match edit GET 4'
674*1596Szelenkov@nginx.com        assert self.post()['status'] == 404, 'match edit POST 4'
675*1596Szelenkov@nginx.com        assert self.put()['status'] == 404, 'match edit PUT 4'
6761053Szelenkov@nginx.com
677*1596Szelenkov@nginx.com        assert 'error' in self.conf_delete(
678*1596Szelenkov@nginx.com            'routes/0/match/method/1'
679*1596Szelenkov@nginx.com        ), 'match edit configure invalid'
680*1596Szelenkov@nginx.com        assert 'error' in self.conf_delete(
681*1596Szelenkov@nginx.com            'routes/0/match/method/-1'
682*1596Szelenkov@nginx.com        ), 'match edit configure invalid 2'
683*1596Szelenkov@nginx.com        assert 'error' in self.conf_delete(
684*1596Szelenkov@nginx.com            'routes/0/match/method/blah'
685*1596Szelenkov@nginx.com        ), 'match edit configure invalid 3'
686*1596Szelenkov@nginx.com        assert ['GET'] == self.conf_get(
687*1596Szelenkov@nginx.com            'routes/0/match/method'
688*1596Szelenkov@nginx.com        ), 'match edit configure 5 check'
6891053Szelenkov@nginx.com
690*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'match edit GET 5'
691*1596Szelenkov@nginx.com        assert self.post()['status'] == 404, 'match edit POST 5'
692*1596Szelenkov@nginx.com        assert self.put()['status'] == 404, 'match edit PUT 5'
693*1596Szelenkov@nginx.com
694*1596Szelenkov@nginx.com        assert 'success' in self.conf_delete(
695*1596Szelenkov@nginx.com            'routes/0/match/method/0'
696*1596Szelenkov@nginx.com        ), 'match edit configure 6'
697*1596Szelenkov@nginx.com        assert [] == self.conf_get(
698*1596Szelenkov@nginx.com            'routes/0/match/method'
699*1596Szelenkov@nginx.com        ), 'match edit configure 6 check'
7001053Szelenkov@nginx.com
701*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'match edit GET 6'
702*1596Szelenkov@nginx.com        assert self.post()['status'] == 200, 'match edit POST 6'
703*1596Szelenkov@nginx.com        assert self.put()['status'] == 200, 'match edit PUT 6'
7041053Szelenkov@nginx.com
705*1596Szelenkov@nginx.com        assert 'success' in self.conf(
706*1596Szelenkov@nginx.com            '"GET"', 'routes/0/match/method'
707*1596Szelenkov@nginx.com        ), 'match edit configure 7'
7081053Szelenkov@nginx.com
709*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'match edit GET 7'
710*1596Szelenkov@nginx.com        assert self.post()['status'] == 404, 'match edit POST 7'
711*1596Szelenkov@nginx.com        assert self.put()['status'] == 404, 'match edit PUT 7'
7121053Szelenkov@nginx.com
713*1596Szelenkov@nginx.com        assert 'error' in self.conf_delete(
714*1596Szelenkov@nginx.com            'routes/0/match/method/0'
715*1596Szelenkov@nginx.com        ), 'match edit configure invalid 5'
716*1596Szelenkov@nginx.com        assert 'error' in self.conf(
717*1596Szelenkov@nginx.com            {}, 'routes/0/action'
718*1596Szelenkov@nginx.com        ), 'match edit configure invalid 6'
7191053Szelenkov@nginx.com
720*1596Szelenkov@nginx.com        assert 'success' in self.conf(
721*1596Szelenkov@nginx.com            {}, 'routes/0/match'
722*1596Szelenkov@nginx.com        ), 'match edit configure 8'
7231053Szelenkov@nginx.com
724*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'match edit GET 8'
7251053Szelenkov@nginx.com
726972Szelenkov@nginx.com    def test_routes_match_rules(self):
7271308Szelenkov@nginx.com        self.route_match({"method": "GET", "host": "localhost", "uri": "/"})
728972Szelenkov@nginx.com
729*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'routes match rules'
730972Szelenkov@nginx.com
731972Szelenkov@nginx.com    def test_routes_loop(self):
732*1596Szelenkov@nginx.com        assert 'success' in self.route(
733*1596Szelenkov@nginx.com            {"match": {"uri": "/"}, "action": {"pass": "routes"}}
734*1596Szelenkov@nginx.com        ), 'routes loop configure'
735972Szelenkov@nginx.com
736*1596Szelenkov@nginx.com        assert self.get()['status'] == 500, 'routes loop'
737972Szelenkov@nginx.com
7381066Szelenkov@nginx.com    def test_routes_match_headers(self):
7391308Szelenkov@nginx.com        self.route_match({"headers": {"host": "localhost"}})
7401066Szelenkov@nginx.com
741*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'match headers'
7421308Szelenkov@nginx.com        self.host('Localhost', 200)
7431308Szelenkov@nginx.com        self.host('localhost.com', 404)
7441308Szelenkov@nginx.com        self.host('llocalhost', 404)
7451308Szelenkov@nginx.com        self.host('host', 404)
7461066Szelenkov@nginx.com
7471066Szelenkov@nginx.com    def test_routes_match_headers_multiple(self):
7481308Szelenkov@nginx.com        self.route_match({"headers": {"host": "localhost", "x-blah": "test"}})
7491066Szelenkov@nginx.com
750*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'match headers multiple'
751*1596Szelenkov@nginx.com        assert (
7521066Szelenkov@nginx.com            self.get(
7531066Szelenkov@nginx.com                headers={
7541066Szelenkov@nginx.com                    "Host": "localhost",
7551066Szelenkov@nginx.com                    "X-blah": "test",
7561066Szelenkov@nginx.com                    "Connection": "close",
7571066Szelenkov@nginx.com                }
758*1596Szelenkov@nginx.com            )['status']
759*1596Szelenkov@nginx.com            == 200
760*1596Szelenkov@nginx.com        ), 'match headers multiple 2'
7611066Szelenkov@nginx.com
762*1596Szelenkov@nginx.com        assert (
7631066Szelenkov@nginx.com            self.get(
7641066Szelenkov@nginx.com                headers={
7651066Szelenkov@nginx.com                    "Host": "localhost",
7661066Szelenkov@nginx.com                    "X-blah": "",
7671066Szelenkov@nginx.com                    "Connection": "close",
7681066Szelenkov@nginx.com                }
769*1596Szelenkov@nginx.com            )['status']
770*1596Szelenkov@nginx.com            == 404
771*1596Szelenkov@nginx.com        ), 'match headers multiple 3'
7721066Szelenkov@nginx.com
7731066Szelenkov@nginx.com    def test_routes_match_headers_multiple_values(self):
7741308Szelenkov@nginx.com        self.route_match({"headers": {"x-blah": "test"}})
7751066Szelenkov@nginx.com
776*1596Szelenkov@nginx.com        assert (
7771066Szelenkov@nginx.com            self.get(
7781066Szelenkov@nginx.com                headers={
7791066Szelenkov@nginx.com                    "Host": "localhost",
7801066Szelenkov@nginx.com                    "X-blah": ["test", "test", "test"],
7811066Szelenkov@nginx.com                    "Connection": "close",
7821066Szelenkov@nginx.com                }
783*1596Szelenkov@nginx.com            )['status']
784*1596Szelenkov@nginx.com            == 200
785*1596Szelenkov@nginx.com        ), 'match headers multiple values'
786*1596Szelenkov@nginx.com        assert (
7871066Szelenkov@nginx.com            self.get(
7881066Szelenkov@nginx.com                headers={
7891066Szelenkov@nginx.com                    "Host": "localhost",
7901066Szelenkov@nginx.com                    "X-blah": ["test", "blah", "test"],
7911066Szelenkov@nginx.com                    "Connection": "close",
7921066Szelenkov@nginx.com                }
793*1596Szelenkov@nginx.com            )['status']
794*1596Szelenkov@nginx.com            == 404
795*1596Szelenkov@nginx.com        ), 'match headers multiple values 2'
796*1596Szelenkov@nginx.com        assert (
7971066Szelenkov@nginx.com            self.get(
7981066Szelenkov@nginx.com                headers={
7991066Szelenkov@nginx.com                    "Host": "localhost",
8001066Szelenkov@nginx.com                    "X-blah": ["test", "", "test"],
8011066Szelenkov@nginx.com                    "Connection": "close",
8021066Szelenkov@nginx.com                }
803*1596Szelenkov@nginx.com            )['status']
804*1596Szelenkov@nginx.com            == 404
805*1596Szelenkov@nginx.com        ), 'match headers multiple values 3'
8061066Szelenkov@nginx.com
8071066Szelenkov@nginx.com    def test_routes_match_headers_multiple_rules(self):
8081308Szelenkov@nginx.com        self.route_match({"headers": {"x-blah": ["test", "blah"]}})
8091066Szelenkov@nginx.com
810*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'match headers multiple rules'
811*1596Szelenkov@nginx.com        assert (
8121066Szelenkov@nginx.com            self.get(
8131066Szelenkov@nginx.com                headers={
8141066Szelenkov@nginx.com                    "Host": "localhost",
8151066Szelenkov@nginx.com                    "X-blah": "test",
8161066Szelenkov@nginx.com                    "Connection": "close",
8171066Szelenkov@nginx.com                }
818*1596Szelenkov@nginx.com            )['status']
819*1596Szelenkov@nginx.com            == 200
820*1596Szelenkov@nginx.com        ), 'match headers multiple rules 2'
821*1596Szelenkov@nginx.com        assert (
8221066Szelenkov@nginx.com            self.get(
8231066Szelenkov@nginx.com                headers={
8241066Szelenkov@nginx.com                    "Host": "localhost",
8251066Szelenkov@nginx.com                    "X-blah": "blah",
8261066Szelenkov@nginx.com                    "Connection": "close",
8271066Szelenkov@nginx.com                }
828*1596Szelenkov@nginx.com            )['status']
829*1596Szelenkov@nginx.com            == 200
830*1596Szelenkov@nginx.com        ), 'match headers multiple rules 3'
831*1596Szelenkov@nginx.com        assert (
8321066Szelenkov@nginx.com            self.get(
8331066Szelenkov@nginx.com                headers={
8341066Szelenkov@nginx.com                    "Host": "localhost",
8351066Szelenkov@nginx.com                    "X-blah": ["test", "blah", "test"],
8361066Szelenkov@nginx.com                    "Connection": "close",
8371066Szelenkov@nginx.com                }
838*1596Szelenkov@nginx.com            )['status']
839*1596Szelenkov@nginx.com            == 200
840*1596Szelenkov@nginx.com        ), 'match headers multiple rules 4'
8411066Szelenkov@nginx.com
842*1596Szelenkov@nginx.com        assert (
8431066Szelenkov@nginx.com            self.get(
8441066Szelenkov@nginx.com                headers={
8451066Szelenkov@nginx.com                    "Host": "localhost",
8461066Szelenkov@nginx.com                    "X-blah": ["blah", ""],
8471066Szelenkov@nginx.com                    "Connection": "close",
8481066Szelenkov@nginx.com                }
849*1596Szelenkov@nginx.com            )['status']
850*1596Szelenkov@nginx.com            == 404
851*1596Szelenkov@nginx.com        ), 'match headers multiple rules 5'
8521066Szelenkov@nginx.com
8531066Szelenkov@nginx.com    def test_routes_match_headers_case_insensitive(self):
8541308Szelenkov@nginx.com        self.route_match({"headers": {"X-BLAH": "TEST"}})
8551066Szelenkov@nginx.com
856*1596Szelenkov@nginx.com        assert (
8571066Szelenkov@nginx.com            self.get(
8581066Szelenkov@nginx.com                headers={
8591066Szelenkov@nginx.com                    "Host": "localhost",
8601066Szelenkov@nginx.com                    "x-blah": "test",
8611066Szelenkov@nginx.com                    "Connection": "close",
8621066Szelenkov@nginx.com                }
863*1596Szelenkov@nginx.com            )['status']
864*1596Szelenkov@nginx.com            == 200
865*1596Szelenkov@nginx.com        ), 'match headers case insensitive'
8661066Szelenkov@nginx.com
8671066Szelenkov@nginx.com    def test_routes_match_headers_invalid(self):
8681308Szelenkov@nginx.com        self.route_match_invalid({"headers": ["blah"]})
8691308Szelenkov@nginx.com        self.route_match_invalid({"headers": {"foo": ["bar", {}]}})
8701308Szelenkov@nginx.com        self.route_match_invalid({"headers": {"": "blah"}})
8711066Szelenkov@nginx.com
8721066Szelenkov@nginx.com    def test_routes_match_headers_empty_rule(self):
8731308Szelenkov@nginx.com        self.route_match({"headers": {"host": ""}})
8741066Szelenkov@nginx.com
875*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'localhost'
8761308Szelenkov@nginx.com        self.host('', 200)
8771066Szelenkov@nginx.com
8781066Szelenkov@nginx.com    def test_routes_match_headers_empty(self):
8791308Szelenkov@nginx.com        self.route_match({"headers": {}})
880*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'empty'
8811066Szelenkov@nginx.com
8821308Szelenkov@nginx.com        self.route_match({"headers": []})
883*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'empty 2'
8841066Szelenkov@nginx.com
8851066Szelenkov@nginx.com    def test_routes_match_headers_rule_array_empty(self):
8861308Szelenkov@nginx.com        self.route_match({"headers": {"blah": []}})
8871066Szelenkov@nginx.com
888*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'array empty'
889*1596Szelenkov@nginx.com        assert (
8901066Szelenkov@nginx.com            self.get(
8911066Szelenkov@nginx.com                headers={
8921066Szelenkov@nginx.com                    "Host": "localhost",
8931066Szelenkov@nginx.com                    "blah": "foo",
8941066Szelenkov@nginx.com                    "Connection": "close",
8951066Szelenkov@nginx.com                }
896*1596Szelenkov@nginx.com            )['status']
897*1596Szelenkov@nginx.com            == 200
898*1596Szelenkov@nginx.com        ), 'match headers rule array empty 2'
8991066Szelenkov@nginx.com
9001066Szelenkov@nginx.com    def test_routes_match_headers_array(self):
9011308Szelenkov@nginx.com        self.route_match(
9021308Szelenkov@nginx.com            {
9031308Szelenkov@nginx.com                "headers": [
9041308Szelenkov@nginx.com                    {"x-header1": "foo*"},
9051308Szelenkov@nginx.com                    {"x-header2": "bar"},
9061308Szelenkov@nginx.com                    {"x-header3": ["foo", "bar"]},
9071308Szelenkov@nginx.com                    {"x-header1": "bar", "x-header4": "foo"},
9081308Szelenkov@nginx.com                ]
9091308Szelenkov@nginx.com            }
9101066Szelenkov@nginx.com        )
9111066Szelenkov@nginx.com
912*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'match headers array'
913*1596Szelenkov@nginx.com        assert (
9141066Szelenkov@nginx.com            self.get(
9151066Szelenkov@nginx.com                headers={
9161066Szelenkov@nginx.com                    "Host": "localhost",
9171066Szelenkov@nginx.com                    "x-header1": "foo123",
9181066Szelenkov@nginx.com                    "Connection": "close",
9191066Szelenkov@nginx.com                }
920*1596Szelenkov@nginx.com            )['status']
921*1596Szelenkov@nginx.com            == 200
922*1596Szelenkov@nginx.com        ), 'match headers array 2'
923*1596Szelenkov@nginx.com        assert (
9241066Szelenkov@nginx.com            self.get(
9251066Szelenkov@nginx.com                headers={
9261066Szelenkov@nginx.com                    "Host": "localhost",
9271066Szelenkov@nginx.com                    "x-header2": "bar",
9281066Szelenkov@nginx.com                    "Connection": "close",
9291066Szelenkov@nginx.com                }
930*1596Szelenkov@nginx.com            )['status']
931*1596Szelenkov@nginx.com            == 200
932*1596Szelenkov@nginx.com        ), 'match headers array 3'
933*1596Szelenkov@nginx.com        assert (
9341066Szelenkov@nginx.com            self.get(
9351066Szelenkov@nginx.com                headers={
9361066Szelenkov@nginx.com                    "Host": "localhost",
9371066Szelenkov@nginx.com                    "x-header3": "bar",
9381066Szelenkov@nginx.com                    "Connection": "close",
9391066Szelenkov@nginx.com                }
940*1596Szelenkov@nginx.com            )['status']
941*1596Szelenkov@nginx.com            == 200
942*1596Szelenkov@nginx.com        ), 'match headers array 4'
943*1596Szelenkov@nginx.com        assert (
9441066Szelenkov@nginx.com            self.get(
9451066Szelenkov@nginx.com                headers={
9461066Szelenkov@nginx.com                    "Host": "localhost",
9471066Szelenkov@nginx.com                    "x-header1": "bar",
9481066Szelenkov@nginx.com                    "Connection": "close",
9491066Szelenkov@nginx.com                }
950*1596Szelenkov@nginx.com            )['status']
951*1596Szelenkov@nginx.com            == 404
952*1596Szelenkov@nginx.com        ), 'match headers array 5'
953*1596Szelenkov@nginx.com        assert (
9541066Szelenkov@nginx.com            self.get(
9551066Szelenkov@nginx.com                headers={
9561066Szelenkov@nginx.com                    "Host": "localhost",
9571066Szelenkov@nginx.com                    "x-header1": "bar",
9581066Szelenkov@nginx.com                    "x-header4": "foo",
9591066Szelenkov@nginx.com                    "Connection": "close",
9601066Szelenkov@nginx.com                }
961*1596Szelenkov@nginx.com            )['status']
962*1596Szelenkov@nginx.com            == 200
963*1596Szelenkov@nginx.com        ), 'match headers array 6'
9641066Szelenkov@nginx.com
965*1596Szelenkov@nginx.com        assert 'success' in self.conf_delete(
966*1596Szelenkov@nginx.com            'routes/0/match/headers/1'
967*1596Szelenkov@nginx.com        ), 'match headers array configure 2'
9681066Szelenkov@nginx.com
969*1596Szelenkov@nginx.com        assert (
9701066Szelenkov@nginx.com            self.get(
9711066Szelenkov@nginx.com                headers={
9721066Szelenkov@nginx.com                    "Host": "localhost",
9731066Szelenkov@nginx.com                    "x-header2": "bar",
9741066Szelenkov@nginx.com                    "Connection": "close",
9751066Szelenkov@nginx.com                }
976*1596Szelenkov@nginx.com            )['status']
977*1596Szelenkov@nginx.com            == 404
978*1596Szelenkov@nginx.com        ), 'match headers array 7'
979*1596Szelenkov@nginx.com        assert (
9801066Szelenkov@nginx.com            self.get(
9811066Szelenkov@nginx.com                headers={
9821066Szelenkov@nginx.com                    "Host": "localhost",
9831066Szelenkov@nginx.com                    "x-header3": "foo",
9841066Szelenkov@nginx.com                    "Connection": "close",
9851066Szelenkov@nginx.com                }
986*1596Szelenkov@nginx.com            )['status']
987*1596Szelenkov@nginx.com            == 200
988*1596Szelenkov@nginx.com        ), 'match headers array 8'
9891017Szelenkov@nginx.com
9901067Szelenkov@nginx.com    def test_routes_match_arguments(self):
9911308Szelenkov@nginx.com        self.route_match({"arguments": {"foo": "bar"}})
9921067Szelenkov@nginx.com
993*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'args'
994*1596Szelenkov@nginx.com        assert self.get(url='/?foo=bar')['status'] == 200, 'args 2'
995*1596Szelenkov@nginx.com        assert self.get(url='/?foo=bar1')['status'] == 404, 'args 3'
996*1596Szelenkov@nginx.com        assert self.get(url='/?1foo=bar')['status'] == 404, 'args 4'
997*1596Szelenkov@nginx.com        assert self.get(url='/?Foo=bar')['status'] == 404, 'case'
998*1596Szelenkov@nginx.com        assert self.get(url='/?foo=Bar')['status'] == 404, 'case 2'
9991067Szelenkov@nginx.com
10001475Saxel.duch@nginx.com    def test_routes_match_arguments_chars(self):
10011475Saxel.duch@nginx.com        chars = (
10021475Saxel.duch@nginx.com            " !\"%23$%25%26'()*%2B,-./0123456789:;<%3D>?@"
10031475Saxel.duch@nginx.com            "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
10041475Saxel.duch@nginx.com        )
10051475Saxel.duch@nginx.com
10061475Saxel.duch@nginx.com        chars_enc = ""
10071475Saxel.duch@nginx.com        for h1 in ["2", "3", "4", "5", "6", "7"]:
1008*1596Szelenkov@nginx.com            for h2 in [
1009*1596Szelenkov@nginx.com                "0",
1010*1596Szelenkov@nginx.com                "1",
1011*1596Szelenkov@nginx.com                "2",
1012*1596Szelenkov@nginx.com                "3",
1013*1596Szelenkov@nginx.com                "4",
1014*1596Szelenkov@nginx.com                "5",
1015*1596Szelenkov@nginx.com                "6",
1016*1596Szelenkov@nginx.com                "7",
1017*1596Szelenkov@nginx.com                "8",
1018*1596Szelenkov@nginx.com                "9",
1019*1596Szelenkov@nginx.com                "A",
1020*1596Szelenkov@nginx.com                "B",
1021*1596Szelenkov@nginx.com                "C",
1022*1596Szelenkov@nginx.com                "D",
1023*1596Szelenkov@nginx.com                "E",
1024*1596Szelenkov@nginx.com                "F",
10251475Saxel.duch@nginx.com            ]:
10261475Saxel.duch@nginx.com                chars_enc += "%" + h1 + h2
10271475Saxel.duch@nginx.com        chars_enc = chars_enc[:-3]
10281475Saxel.duch@nginx.com
10291475Saxel.duch@nginx.com        def check_args(args, query):
10301475Saxel.duch@nginx.com            self.route_match({"arguments": args})
1031*1596Szelenkov@nginx.com            assert self.get(url='/?' + query)['status'] == 200
10321475Saxel.duch@nginx.com
10331475Saxel.duch@nginx.com        check_args({chars: chars}, chars + '=' + chars)
10341475Saxel.duch@nginx.com        check_args({chars: chars}, chars + '=' + chars_enc)
10351475Saxel.duch@nginx.com        check_args({chars: chars}, chars_enc + '=' + chars)
10361475Saxel.duch@nginx.com        check_args({chars: chars}, chars_enc + '=' + chars_enc)
10371475Saxel.duch@nginx.com        check_args({chars_enc: chars_enc}, chars + '=' + chars)
10381475Saxel.duch@nginx.com        check_args({chars_enc: chars_enc}, chars + '=' + chars_enc)
10391475Saxel.duch@nginx.com        check_args({chars_enc: chars_enc}, chars_enc + '=' + chars)
10401475Saxel.duch@nginx.com        check_args({chars_enc: chars_enc}, chars_enc + '=' + chars_enc)
10411475Saxel.duch@nginx.com
10421067Szelenkov@nginx.com    def test_routes_match_arguments_empty(self):
10431308Szelenkov@nginx.com        self.route_match({"arguments": {}})
1044*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'arguments empty'
10451067Szelenkov@nginx.com
10461308Szelenkov@nginx.com        self.route_match({"arguments": []})
1047*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'arguments empty 2'
10481067Szelenkov@nginx.com
10491067Szelenkov@nginx.com    def test_routes_match_arguments_space(self):
10501475Saxel.duch@nginx.com        self.route_match({"arguments": {"+fo o%20": "%20b+a r"}})
1051*1596Szelenkov@nginx.com        assert self.get(url='/? fo o = b a r&')['status'] == 200
1052*1596Szelenkov@nginx.com        assert self.get(url='/?+fo+o+=+b+a+r&')['status'] == 200
1053*1596Szelenkov@nginx.com        assert self.get(url='/?%20fo%20o%20=%20b%20a%20r&')['status'] == 200
10541067Szelenkov@nginx.com
10551475Saxel.duch@nginx.com        self.route_match({"arguments": {"%20foo": " bar"}})
1056*1596Szelenkov@nginx.com        assert self.get(url='/? foo= bar')['status'] == 200
1057*1596Szelenkov@nginx.com        assert self.get(url='/?+foo=+bar')['status'] == 200
1058*1596Szelenkov@nginx.com        assert self.get(url='/?%20foo=%20bar')['status'] == 200
1059*1596Szelenkov@nginx.com        assert self.get(url='/?+foo= bar')['status'] == 200
1060*1596Szelenkov@nginx.com        assert self.get(url='/?%20foo=+bar')['status'] == 200
10611475Saxel.duch@nginx.com
10621475Saxel.duch@nginx.com    def test_routes_match_arguments_equal(self):
10631475Saxel.duch@nginx.com        self.route_match({"arguments": {"=": "="}})
1064*1596Szelenkov@nginx.com        assert self.get(url='/?%3D=%3D')['status'] == 200
1065*1596Szelenkov@nginx.com        assert self.get(url='/?%3D==')['status'] == 200
1066*1596Szelenkov@nginx.com        assert self.get(url='/?===')['status'] == 404
1067*1596Szelenkov@nginx.com        assert self.get(url='/?%3D%3D%3D')['status'] == 404
1068*1596Szelenkov@nginx.com        assert self.get(url='/?==%3D')['status'] == 404
10691475Saxel.duch@nginx.com
10701475Saxel.duch@nginx.com    def test_routes_match_arguments_enc(self):
10711475Saxel.duch@nginx.com        self.route_match({"arguments": {"Ю": "н"}})
1072*1596Szelenkov@nginx.com        assert self.get(url='/?%D0%AE=%D0%BD')['status'] == 200
1073*1596Szelenkov@nginx.com        assert self.get(url='/?%d0%ae=%d0%Bd')['status'] == 200
10741475Saxel.duch@nginx.com
10751475Saxel.duch@nginx.com    def test_routes_match_arguments_hash(self):
10761475Saxel.duch@nginx.com        self.route_match({"arguments": {"#": "#"}})
1077*1596Szelenkov@nginx.com        assert self.get(url='/?%23=%23')['status'] == 200
1078*1596Szelenkov@nginx.com        assert self.get(url='/?%23=%23#')['status'] == 200
1079*1596Szelenkov@nginx.com        assert self.get(url='/?#=#')['status'] == 404
1080*1596Szelenkov@nginx.com        assert self.get(url='/?%23=#')['status'] == 404
10811475Saxel.duch@nginx.com
10821475Saxel.duch@nginx.com    def test_routes_match_arguments_wildcard(self):
10831475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "*"}})
1084*1596Szelenkov@nginx.com        assert self.get(url='/?foo')['status'] == 200
1085*1596Szelenkov@nginx.com        assert self.get(url='/?foo=')['status'] == 200
1086*1596Szelenkov@nginx.com        assert self.get(url='/?foo=blah')['status'] == 200
1087*1596Szelenkov@nginx.com        assert self.get(url='/?blah=foo')['status'] == 404
10881475Saxel.duch@nginx.com
10891475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "%25*"}})
1090*1596Szelenkov@nginx.com        assert self.get(url='/?foo=%xx')['status'] == 200
10911475Saxel.duch@nginx.com
10921475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "%2A*"}})
1093*1596Szelenkov@nginx.com        assert self.get(url='/?foo=*xx')['status'] == 200
1094*1596Szelenkov@nginx.com        assert self.get(url='/?foo=xx')['status'] == 404
10951475Saxel.duch@nginx.com
10961475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "*%2A"}})
1097*1596Szelenkov@nginx.com        assert self.get(url='/?foo=xx*')['status'] == 200
1098*1596Szelenkov@nginx.com        assert self.get(url='/?foo=xx*x')['status'] == 404
10991067Szelenkov@nginx.com
11001475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "1*2"}})
1101*1596Szelenkov@nginx.com        assert self.get(url='/?foo=12')['status'] == 200
1102*1596Szelenkov@nginx.com        assert self.get(url='/?foo=1blah2')['status'] == 200
1103*1596Szelenkov@nginx.com        assert self.get(url='/?foo=1%2A2')['status'] == 200
1104*1596Szelenkov@nginx.com        assert self.get(url='/?foo=x12')['status'] == 404
11051475Saxel.duch@nginx.com
11061475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "bar*", "%25": "%25"}})
1107*1596Szelenkov@nginx.com        assert self.get(url='/?foo=barxx&%=%')['status'] == 200
1108*1596Szelenkov@nginx.com        assert self.get(url='/?foo=barxx&x%=%')['status'] == 404
11091475Saxel.duch@nginx.com
11101475Saxel.duch@nginx.com    def test_routes_match_arguments_negative(self):
11111475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "!%25"}})
1112*1596Szelenkov@nginx.com        assert self.get(url='/?foo=blah')['status'] == 200
1113*1596Szelenkov@nginx.com        assert self.get(url='/?foo=%')['status'] == 404
11141475Saxel.duch@nginx.com
11151475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "%21blah"}})
1116*1596Szelenkov@nginx.com        assert self.get(url='/?foo=%21blah')['status'] == 200
1117*1596Szelenkov@nginx.com        assert self.get(url='/?foo=!blah')['status'] == 200
1118*1596Szelenkov@nginx.com        assert self.get(url='/?foo=bar')['status'] == 404
11191475Saxel.duch@nginx.com
11201475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "!!%21*a"}})
1121*1596Szelenkov@nginx.com        assert self.get(url='/?foo=blah')['status'] == 200
1122*1596Szelenkov@nginx.com        assert self.get(url='/?foo=!blah')['status'] == 200
1123*1596Szelenkov@nginx.com        assert self.get(url='/?foo=!!a')['status'] == 404
1124*1596Szelenkov@nginx.com        assert self.get(url='/?foo=!!bla')['status'] == 404
11251067Szelenkov@nginx.com
11261475Saxel.duch@nginx.com    def test_routes_match_arguments_percent(self):
11271475Saxel.duch@nginx.com        self.route_match({"arguments": {"%25": "%25"}})
1128*1596Szelenkov@nginx.com        assert self.get(url='/?%=%')['status'] == 200
1129*1596Szelenkov@nginx.com        assert self.get(url='/?%25=%25')['status'] == 200
1130*1596Szelenkov@nginx.com        assert self.get(url='/?%25=%')['status'] == 200
11311475Saxel.duch@nginx.com
11321475Saxel.duch@nginx.com        self.route_match({"arguments": {"%251": "%252"}})
1133*1596Szelenkov@nginx.com        assert self.get(url='/?%1=%2')['status'] == 200
1134*1596Szelenkov@nginx.com        assert self.get(url='/?%251=%252')['status'] == 200
1135*1596Szelenkov@nginx.com        assert self.get(url='/?%251=%2')['status'] == 200
11361067Szelenkov@nginx.com
11371475Saxel.duch@nginx.com        self.route_match({"arguments": {"%25%21%251": "%25%24%252"}})
1138*1596Szelenkov@nginx.com        assert self.get(url='/?%!%1=%$%2')['status'] == 200
1139*1596Szelenkov@nginx.com        assert self.get(url='/?%25!%251=%25$%252')['status'] == 200
1140*1596Szelenkov@nginx.com        assert self.get(url='/?%25!%1=%$%2')['status'] == 200
11411475Saxel.duch@nginx.com
11421475Saxel.duch@nginx.com    def test_routes_match_arguments_ampersand(self):
11431475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "&"}})
1144*1596Szelenkov@nginx.com        assert self.get(url='/?foo=%26')['status'] == 200
1145*1596Szelenkov@nginx.com        assert self.get(url='/?foo=%26&')['status'] == 200
1146*1596Szelenkov@nginx.com        assert self.get(url='/?foo=%26%26')['status'] == 404
1147*1596Szelenkov@nginx.com        assert self.get(url='/?foo=&')['status'] == 404
11481475Saxel.duch@nginx.com
11491475Saxel.duch@nginx.com        self.route_match({"arguments": {"&": ""}})
1150*1596Szelenkov@nginx.com        assert self.get(url='/?%26=')['status'] == 200
1151*1596Szelenkov@nginx.com        assert self.get(url='/?%26=&')['status'] == 200
1152*1596Szelenkov@nginx.com        assert self.get(url='/?%26=%26')['status'] == 404
1153*1596Szelenkov@nginx.com        assert self.get(url='/?&=')['status'] == 404
11541067Szelenkov@nginx.com
11551067Szelenkov@nginx.com    def test_routes_match_arguments_complex(self):
11561308Szelenkov@nginx.com        self.route_match({"arguments": {"foo": ""}})
11571067Szelenkov@nginx.com
1158*1596Szelenkov@nginx.com        assert self.get(url='/?foo')['status'] == 200, 'complex'
1159*1596Szelenkov@nginx.com        assert self.get(url='/?blah=blah&foo=')['status'] == 200, 'complex 2'
1160*1596Szelenkov@nginx.com        assert self.get(url='/?&&&foo&&&')['status'] == 200, 'complex 3'
1161*1596Szelenkov@nginx.com        assert self.get(url='/?foo&foo=bar&foo')['status'] == 404, 'complex 4'
1162*1596Szelenkov@nginx.com        assert self.get(url='/?foo=&foo')['status'] == 200, 'complex 5'
1163*1596Szelenkov@nginx.com        assert self.get(url='/?&=&foo&==&')['status'] == 200, 'complex 6'
1164*1596Szelenkov@nginx.com        assert self.get(url='/?&=&bar&==&')['status'] == 404, 'complex 7'
11651067Szelenkov@nginx.com
11661067Szelenkov@nginx.com    def test_routes_match_arguments_multiple(self):
11671308Szelenkov@nginx.com        self.route_match({"arguments": {"foo": "bar", "blah": "test"}})
11681067Szelenkov@nginx.com
1169*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'multiple'
1170*1596Szelenkov@nginx.com        assert (
1171*1596Szelenkov@nginx.com            self.get(url='/?foo=bar&blah=test')['status'] == 200
1172*1596Szelenkov@nginx.com        ), 'multiple 2'
1173*1596Szelenkov@nginx.com        assert self.get(url='/?foo=bar&blah')['status'] == 404, 'multiple 3'
1174*1596Szelenkov@nginx.com        assert (
1175*1596Szelenkov@nginx.com            self.get(url='/?foo=bar&blah=tes')['status'] == 404
1176*1596Szelenkov@nginx.com        ), 'multiple 4'
1177*1596Szelenkov@nginx.com        assert (
1178*1596Szelenkov@nginx.com            self.get(url='/?foo=b%61r&bl%61h=t%65st')['status'] == 200
1179*1596Szelenkov@nginx.com        ), 'multiple 5'
11801067Szelenkov@nginx.com
11811067Szelenkov@nginx.com    def test_routes_match_arguments_multiple_rules(self):
11821308Szelenkov@nginx.com        self.route_match({"arguments": {"foo": ["bar", "blah"]}})
11831067Szelenkov@nginx.com
1184*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'rules'
1185*1596Szelenkov@nginx.com        assert self.get(url='/?foo=bar')['status'] == 200, 'rules 2'
1186*1596Szelenkov@nginx.com        assert self.get(url='/?foo=blah')['status'] == 200, 'rules 3'
1187*1596Szelenkov@nginx.com        assert (
1188*1596Szelenkov@nginx.com            self.get(url='/?foo=blah&foo=bar&foo=blah')['status'] == 200
1189*1596Szelenkov@nginx.com        ), 'rules 4'
1190*1596Szelenkov@nginx.com        assert (
1191*1596Szelenkov@nginx.com            self.get(url='/?foo=blah&foo=bar&foo=')['status'] == 404
1192*1596Szelenkov@nginx.com        ), 'rules 5'
11931067Szelenkov@nginx.com
11941067Szelenkov@nginx.com    def test_routes_match_arguments_array(self):
11951308Szelenkov@nginx.com        self.route_match(
11961308Szelenkov@nginx.com            {
11971308Szelenkov@nginx.com                "arguments": [
11981308Szelenkov@nginx.com                    {"var1": "val1*"},
11991308Szelenkov@nginx.com                    {"var2": "val2"},
12001308Szelenkov@nginx.com                    {"var3": ["foo", "bar"]},
12011308Szelenkov@nginx.com                    {"var1": "bar", "var4": "foo"},
12021308Szelenkov@nginx.com                ]
12031308Szelenkov@nginx.com            }
12041067Szelenkov@nginx.com        )
12051067Szelenkov@nginx.com
1206*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'arr'
1207*1596Szelenkov@nginx.com        assert self.get(url='/?var1=val123')['status'] == 200, 'arr 2'
1208*1596Szelenkov@nginx.com        assert self.get(url='/?var2=val2')['status'] == 200, 'arr 3'
1209*1596Szelenkov@nginx.com        assert self.get(url='/?var3=bar')['status'] == 200, 'arr 4'
1210*1596Szelenkov@nginx.com        assert self.get(url='/?var1=bar')['status'] == 404, 'arr 5'
1211*1596Szelenkov@nginx.com        assert self.get(url='/?var1=bar&var4=foo')['status'] == 200, 'arr 6'
12121067Szelenkov@nginx.com
1213*1596Szelenkov@nginx.com        assert 'success' in self.conf_delete(
1214*1596Szelenkov@nginx.com            'routes/0/match/arguments/1'
1215*1596Szelenkov@nginx.com        ), 'match arguments array configure 2'
12161067Szelenkov@nginx.com
1217*1596Szelenkov@nginx.com        assert self.get(url='/?var2=val2')['status'] == 404, 'arr 7'
1218*1596Szelenkov@nginx.com        assert self.get(url='/?var3=foo')['status'] == 200, 'arr 8'
12191067Szelenkov@nginx.com
12201475Saxel.duch@nginx.com    def test_routes_match_arguments_invalid(self):
12211475Saxel.duch@nginx.com        # TODO remove it after controller fixed
1222*1596Szelenkov@nginx.com        skip_alert(r'failed to apply new conf')
12231475Saxel.duch@nginx.com
12241475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": ["var"]})
12251475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": [{"var1": {}}]})
12261475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"": "bar"}})
12271475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"foo": "%"}})
12281475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"foo": "%1G"}})
12291475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"%": "bar"}})
12301475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"foo": "%0"}})
12311475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"foo": "%%1F"}})
12321475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"%%1F": ""}})
12331475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"%7%F": ""}})
12341475Saxel.duch@nginx.com
12351068Szelenkov@nginx.com    def test_routes_match_cookies(self):
12361308Szelenkov@nginx.com        self.route_match({"cookies": {"foO": "bar"}})
12371068Szelenkov@nginx.com
1238*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'cookie'
12391308Szelenkov@nginx.com        self.cookie('foO=bar', 200)
12401308Szelenkov@nginx.com        self.cookie('foO=bar;1', 200)
12411308Szelenkov@nginx.com        self.cookie(['foO=bar', 'blah=blah'], 200)
12421308Szelenkov@nginx.com        self.cookie('foO=bar; blah=blah', 200)
12431308Szelenkov@nginx.com        self.cookie('Foo=bar', 404)
12441308Szelenkov@nginx.com        self.cookie('foO=Bar', 404)
12451308Szelenkov@nginx.com        self.cookie('foO=bar1', 404)
12461308Szelenkov@nginx.com        self.cookie('1foO=bar;', 404)
12471068Szelenkov@nginx.com
12481068Szelenkov@nginx.com    def test_routes_match_cookies_empty(self):
12491308Szelenkov@nginx.com        self.route_match({"cookies": {}})
1250*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'cookies empty'
12511068Szelenkov@nginx.com
12521308Szelenkov@nginx.com        self.route_match({"cookies": []})
1253*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'cookies empty 2'
12541068Szelenkov@nginx.com
12551068Szelenkov@nginx.com    def test_routes_match_cookies_invalid(self):
12561308Szelenkov@nginx.com        self.route_match_invalid({"cookies": ["var"]})
12571308Szelenkov@nginx.com        self.route_match_invalid({"cookies": [{"foo": {}}]})
12581068Szelenkov@nginx.com
12591068Szelenkov@nginx.com    def test_routes_match_cookies_multiple(self):
12601308Szelenkov@nginx.com        self.route_match({"cookies": {"foo": "bar", "blah": "blah"}})
12611308Szelenkov@nginx.com
1262*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'multiple'
12631308Szelenkov@nginx.com        self.cookie('foo=bar; blah=blah', 200)
12641308Szelenkov@nginx.com        self.cookie(['foo=bar', 'blah=blah'], 200)
12651308Szelenkov@nginx.com        self.cookie(['foo=bar; blah', 'blah'], 404)
12661308Szelenkov@nginx.com        self.cookie(['foo=bar; blah=test', 'blah=blah'], 404)
12671068Szelenkov@nginx.com
12681308Szelenkov@nginx.com    def test_routes_match_cookies_multiple_values(self):
12691308Szelenkov@nginx.com        self.route_match({"cookies": {"blah": "blah"}})
12701308Szelenkov@nginx.com
12711308Szelenkov@nginx.com        self.cookie(['blah=blah', 'blah=blah', 'blah=blah'], 200)
12721308Szelenkov@nginx.com        self.cookie(['blah=blah', 'blah=test', 'blah=blah'], 404)
12731308Szelenkov@nginx.com        self.cookie(['blah=blah; blah=', 'blah=blah'], 404)
12741308Szelenkov@nginx.com
12751308Szelenkov@nginx.com    def test_routes_match_cookies_multiple_rules(self):
12761308Szelenkov@nginx.com        self.route_match({"cookies": {"blah": ["test", "blah"]}})
12771068Szelenkov@nginx.com
1278*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'multiple rules'
12791308Szelenkov@nginx.com        self.cookie('blah=test', 200)
12801308Szelenkov@nginx.com        self.cookie('blah=blah', 200)
12811308Szelenkov@nginx.com        self.cookie(['blah=blah', 'blah=test', 'blah=blah'], 200)
12821308Szelenkov@nginx.com        self.cookie(['blah=blah; blah=test', 'blah=blah'], 200)
1283*1596Szelenkov@nginx.com        self.cookie(['blah=blah', 'blah'], 200)  # invalid cookie
12841068Szelenkov@nginx.com
12851308Szelenkov@nginx.com    def test_routes_match_cookies_array(self):
12861308Szelenkov@nginx.com        self.route_match(
12871308Szelenkov@nginx.com            {
12881308Szelenkov@nginx.com                "cookies": [
12891308Szelenkov@nginx.com                    {"var1": "val1*"},
12901308Szelenkov@nginx.com                    {"var2": "val2"},
12911308Szelenkov@nginx.com                    {"var3": ["foo", "bar"]},
12921308Szelenkov@nginx.com                    {"var1": "bar", "var4": "foo"},
12931308Szelenkov@nginx.com                ]
12941308Szelenkov@nginx.com            }
12951068Szelenkov@nginx.com        )
12961068Szelenkov@nginx.com
1297*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'cookies array'
12981308Szelenkov@nginx.com        self.cookie('var1=val123', 200)
12991308Szelenkov@nginx.com        self.cookie('var2=val2', 200)
13001308Szelenkov@nginx.com        self.cookie(' var2=val2 ', 200)
13011308Szelenkov@nginx.com        self.cookie('var3=bar', 200)
13021308Szelenkov@nginx.com        self.cookie('var3=bar;', 200)
13031308Szelenkov@nginx.com        self.cookie('var1=bar', 404)
13041308Szelenkov@nginx.com        self.cookie('var1=bar; var4=foo;', 200)
13051308Szelenkov@nginx.com        self.cookie(['var1=bar', 'var4=foo'], 200)
13061068Szelenkov@nginx.com
1307*1596Szelenkov@nginx.com        assert 'success' in self.conf_delete(
1308*1596Szelenkov@nginx.com            'routes/0/match/cookies/1'
1309*1596Szelenkov@nginx.com        ), 'match cookies array configure 2'
13101068Szelenkov@nginx.com
13111308Szelenkov@nginx.com        self.cookie('var2=val2', 404)
13121308Szelenkov@nginx.com        self.cookie('var3=foo', 200)
13131068Szelenkov@nginx.com
13141110Saxel.duch@nginx.com    def test_routes_match_scheme(self):
13151308Szelenkov@nginx.com        self.route_match({"scheme": "http"})
13161308Szelenkov@nginx.com        self.route_match({"scheme": "https"})
13171308Szelenkov@nginx.com        self.route_match({"scheme": "HtTp"})
13181308Szelenkov@nginx.com        self.route_match({"scheme": "HtTpS"})
13191110Saxel.duch@nginx.com
13201110Saxel.duch@nginx.com    def test_routes_match_scheme_invalid(self):
13211308Szelenkov@nginx.com        self.route_match_invalid({"scheme": ["http"]})
13221308Szelenkov@nginx.com        self.route_match_invalid({"scheme": "ftp"})
13231308Szelenkov@nginx.com        self.route_match_invalid({"scheme": "ws"})
13241308Szelenkov@nginx.com        self.route_match_invalid({"scheme": "*"})
13251308Szelenkov@nginx.com        self.route_match_invalid({"scheme": ""})
13261308Szelenkov@nginx.com
13271325Saxel.duch@nginx.com    def test_routes_source_port(self):
13281325Saxel.duch@nginx.com        def sock_port():
13291325Saxel.duch@nginx.com            _, sock = self.http(b'', start=True, raw=True, no_recv=True)
13301325Saxel.duch@nginx.com            port = sock.getsockname()[1]
13311325Saxel.duch@nginx.com            return (sock, port)
13321325Saxel.duch@nginx.com
13331325Saxel.duch@nginx.com        sock, port = sock_port()
13341325Saxel.duch@nginx.com        sock2, port2 = sock_port()
13351325Saxel.duch@nginx.com
13361325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.1:" + str(port)})
1337*1596Szelenkov@nginx.com        assert self.get(sock=sock)['status'] == 200, 'exact'
1338*1596Szelenkov@nginx.com        assert self.get(sock=sock2)['status'] == 404, 'exact 2'
13391325Saxel.duch@nginx.com
13401325Saxel.duch@nginx.com        sock, port = sock_port()
13411325Saxel.duch@nginx.com        sock2, port2 = sock_port()
13421325Saxel.duch@nginx.com
13431325Saxel.duch@nginx.com        self.route_match({"source": "!127.0.0.1:" + str(port)})
1344*1596Szelenkov@nginx.com        assert self.get(sock=sock)['status'] == 404, 'negative'
1345*1596Szelenkov@nginx.com        assert self.get(sock=sock2)['status'] == 200, 'negative 2'
13461325Saxel.duch@nginx.com
13471325Saxel.duch@nginx.com        sock, port = sock_port()
13481325Saxel.duch@nginx.com        sock2, port2 = sock_port()
13491325Saxel.duch@nginx.com
13501391Szelenkov@nginx.com        self.route_match({"source": ["*:" + str(port), "!127.0.0.1"]})
1351*1596Szelenkov@nginx.com        assert self.get(sock=sock)['status'] == 404, 'negative 3'
1352*1596Szelenkov@nginx.com        assert self.get(sock=sock2)['status'] == 404, 'negative 4'
13531391Szelenkov@nginx.com
13541391Szelenkov@nginx.com        sock, port = sock_port()
13551391Szelenkov@nginx.com        sock2, port2 = sock_port()
13561391Szelenkov@nginx.com
13571325Saxel.duch@nginx.com        self.route_match(
13581325Saxel.duch@nginx.com            {"source": "127.0.0.1:" + str(port) + "-" + str(port)}
13591325Saxel.duch@nginx.com        )
1360*1596Szelenkov@nginx.com        assert self.get(sock=sock)['status'] == 200, 'range single'
1361*1596Szelenkov@nginx.com        assert self.get(sock=sock2)['status'] == 404, 'range single 2'
13621325Saxel.duch@nginx.com
13631325Saxel.duch@nginx.com        socks = [
13641325Saxel.duch@nginx.com            sock_port(),
13651325Saxel.duch@nginx.com            sock_port(),
13661325Saxel.duch@nginx.com            sock_port(),
13671325Saxel.duch@nginx.com            sock_port(),
13681325Saxel.duch@nginx.com            sock_port(),
13691325Saxel.duch@nginx.com        ]
13701325Saxel.duch@nginx.com        socks.sort(key=lambda sock: sock[1])
13711325Saxel.duch@nginx.com
13721325Saxel.duch@nginx.com        self.route_match(
13731325Saxel.duch@nginx.com            {
13741325Saxel.duch@nginx.com                "source": "127.0.0.1:"
13751325Saxel.duch@nginx.com                + str(socks[1][1])  # second port number
13761325Saxel.duch@nginx.com                + "-"
13771325Saxel.duch@nginx.com                + str(socks[3][1])  # fourth port number
13781325Saxel.duch@nginx.com            }
13791325Saxel.duch@nginx.com        )
1380*1596Szelenkov@nginx.com        assert self.get(sock=socks[0][0])['status'] == 404, 'range'
1381*1596Szelenkov@nginx.com        assert self.get(sock=socks[1][0])['status'] == 200, 'range 2'
1382*1596Szelenkov@nginx.com        assert self.get(sock=socks[2][0])['status'] == 200, 'range 3'
1383*1596Szelenkov@nginx.com        assert self.get(sock=socks[3][0])['status'] == 200, 'range 4'
1384*1596Szelenkov@nginx.com        assert self.get(sock=socks[4][0])['status'] == 404, 'range 5'
13851325Saxel.duch@nginx.com
13861325Saxel.duch@nginx.com        socks = [
13871325Saxel.duch@nginx.com            sock_port(),
13881325Saxel.duch@nginx.com            sock_port(),
13891325Saxel.duch@nginx.com            sock_port(),
13901325Saxel.duch@nginx.com        ]
13911325Saxel.duch@nginx.com        socks.sort(key=lambda sock: sock[1])
13921325Saxel.duch@nginx.com
13931325Saxel.duch@nginx.com        self.route_match(
13941325Saxel.duch@nginx.com            {
13951325Saxel.duch@nginx.com                "source": [
13961325Saxel.duch@nginx.com                    "127.0.0.1:" + str(socks[0][1]),
13971325Saxel.duch@nginx.com                    "127.0.0.1:" + str(socks[2][1]),
13981325Saxel.duch@nginx.com                ]
13991325Saxel.duch@nginx.com            }
14001325Saxel.duch@nginx.com        )
1401*1596Szelenkov@nginx.com        assert self.get(sock=socks[0][0])['status'] == 200, 'array'
1402*1596Szelenkov@nginx.com        assert self.get(sock=socks[1][0])['status'] == 404, 'array 2'
1403*1596Szelenkov@nginx.com        assert self.get(sock=socks[2][0])['status'] == 200, 'array 3'
14041325Saxel.duch@nginx.com
14051325Saxel.duch@nginx.com    def test_routes_source_addr(self):
1406*1596Szelenkov@nginx.com        assert 'success' in self.conf(
1407*1596Szelenkov@nginx.com            {"*:7080": {"pass": "routes"}, "[::1]:7081": {"pass": "routes"},},
1408*1596Szelenkov@nginx.com            'listeners',
1409*1596Szelenkov@nginx.com        ), 'source listeners configure'
14101325Saxel.duch@nginx.com
14111325Saxel.duch@nginx.com        def get_ipv6():
14121325Saxel.duch@nginx.com            return self.get(sock_type='ipv6', port=7081)
14131325Saxel.duch@nginx.com
14141325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.1"})
1415*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'exact'
1416*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 404, 'exact ipv6'
14171325Saxel.duch@nginx.com
14181325Saxel.duch@nginx.com        self.route_match({"source": ["127.0.0.1"]})
1419*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'exact 2'
1420*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 404, 'exact 2 ipv6'
14211325Saxel.duch@nginx.com
14221325Saxel.duch@nginx.com        self.route_match({"source": "!127.0.0.1"})
1423*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'exact neg'
1424*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 200, 'exact neg ipv6'
14251325Saxel.duch@nginx.com
14261325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.2"})
1427*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'exact 3'
1428*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 404, 'exact 3 ipv6'
14291325Saxel.duch@nginx.com
14301325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.1-127.0.0.1"})
1431*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'range single'
1432*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 404, 'range single ipv6'
14331325Saxel.duch@nginx.com
14341325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.2-127.0.0.2"})
1435*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'range single 2'
1436*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 404, 'range single 2 ipv6'
14371325Saxel.duch@nginx.com
14381325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.2-127.0.0.3"})
1439*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'range'
1440*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 404, 'range ipv6'
14411325Saxel.duch@nginx.com
14421325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.1-127.0.0.2"})
1443*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'range 2'
1444*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 404, 'range 2 ipv6'
14451325Saxel.duch@nginx.com
14461325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.0-127.0.0.2"})
1447*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'range 3'
1448*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 404, 'range 3 ipv6'
14491325Saxel.duch@nginx.com
14501325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.0-127.0.0.1"})
1451*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'range 4'
1452*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 404, 'range 4 ipv6'
14531325Saxel.duch@nginx.com
14541325Saxel.duch@nginx.com        self.route_match({"source": "126.0.0.0-127.0.0.0"})
1455*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'range 5'
1456*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 404, 'range 5 ipv6'
14571325Saxel.duch@nginx.com
14581325Saxel.duch@nginx.com        self.route_match({"source": "126.126.126.126-127.0.0.2"})
1459*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'range 6'
1460*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 404, 'range 6 ipv6'
14611325Saxel.duch@nginx.com
14621325Saxel.duch@nginx.com    def test_routes_source_ipv6(self):
1463*1596Szelenkov@nginx.com        assert 'success' in self.conf(
1464*1596Szelenkov@nginx.com            {
1465*1596Szelenkov@nginx.com                "[::1]:7080": {"pass": "routes"},
1466*1596Szelenkov@nginx.com                "127.0.0.1:7081": {"pass": "routes"},
1467*1596Szelenkov@nginx.com            },
1468*1596Szelenkov@nginx.com            'listeners',
1469*1596Szelenkov@nginx.com        ), 'source listeners configure'
14701325Saxel.duch@nginx.com
14711325Saxel.duch@nginx.com        self.route_match({"source": "::1"})
1472*1596Szelenkov@nginx.com        assert self.get(sock_type='ipv6')['status'] == 200, 'exact'
1473*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, 'exact ipv4'
14741325Saxel.duch@nginx.com
14751325Saxel.duch@nginx.com        self.route_match({"source": ["::1"]})
1476*1596Szelenkov@nginx.com        assert self.get(sock_type='ipv6')['status'] == 200, 'exact 2'
1477*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, 'exact 2 ipv4'
14781325Saxel.duch@nginx.com
14791325Saxel.duch@nginx.com        self.route_match({"source": "!::1"})
1480*1596Szelenkov@nginx.com        assert self.get(sock_type='ipv6')['status'] == 404, 'exact neg'
1481*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 200, 'exact neg ipv4'
14821325Saxel.duch@nginx.com
14831325Saxel.duch@nginx.com        self.route_match({"source": "::2"})
1484*1596Szelenkov@nginx.com        assert self.get(sock_type='ipv6')['status'] == 404, 'exact 3'
1485*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, 'exact 3 ipv4'
14861325Saxel.duch@nginx.com
14871325Saxel.duch@nginx.com        self.route_match({"source": "::1-::1"})
1488*1596Szelenkov@nginx.com        assert self.get(sock_type='ipv6')['status'] == 200, 'range'
1489*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, 'range ipv4'
14901325Saxel.duch@nginx.com
14911325Saxel.duch@nginx.com        self.route_match({"source": "::2-::2"})
1492*1596Szelenkov@nginx.com        assert self.get(sock_type='ipv6')['status'] == 404, 'range 2'
1493*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, 'range 2 ipv4'
14941325Saxel.duch@nginx.com
14951325Saxel.duch@nginx.com        self.route_match({"source": "::2-::3"})
1496*1596Szelenkov@nginx.com        assert self.get(sock_type='ipv6')['status'] == 404, 'range 3'
1497*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, 'range 3 ipv4'
14981325Saxel.duch@nginx.com
14991325Saxel.duch@nginx.com        self.route_match({"source": "::1-::2"})
1500*1596Szelenkov@nginx.com        assert self.get(sock_type='ipv6')['status'] == 200, 'range 4'
1501*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, 'range 4 ipv4'
15021325Saxel.duch@nginx.com
15031325Saxel.duch@nginx.com        self.route_match({"source": "::0-::2"})
1504*1596Szelenkov@nginx.com        assert self.get(sock_type='ipv6')['status'] == 200, 'range 5'
1505*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, 'range 5 ipv4'
15061325Saxel.duch@nginx.com
15071325Saxel.duch@nginx.com        self.route_match({"source": "::0-::1"})
1508*1596Szelenkov@nginx.com        assert self.get(sock_type='ipv6')['status'] == 200, 'range 6'
1509*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, 'range 6 ipv4'
15101325Saxel.duch@nginx.com
15111325Saxel.duch@nginx.com    def test_routes_source_cidr(self):
1512*1596Szelenkov@nginx.com        assert 'success' in self.conf(
1513*1596Szelenkov@nginx.com            {"*:7080": {"pass": "routes"}, "[::1]:7081": {"pass": "routes"},},
1514*1596Szelenkov@nginx.com            'listeners',
1515*1596Szelenkov@nginx.com        ), 'source listeners configure'
15161325Saxel.duch@nginx.com
15171325Saxel.duch@nginx.com        def get_ipv6():
15181325Saxel.duch@nginx.com            return self.get(sock_type='ipv6', port=7081)
15191325Saxel.duch@nginx.com
15201325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.1/32"})
1521*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, '32'
1522*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 404, '32 ipv6'
15231325Saxel.duch@nginx.com
15241325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.0/32"})
1525*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, '32 2'
1526*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 404, '32 2 ipv6'
15271325Saxel.duch@nginx.com
15281325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.0/31"})
1529*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, '31'
1530*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 404, '31 ipv6'
15311325Saxel.duch@nginx.com
15321325Saxel.duch@nginx.com        self.route_match({"source": "0.0.0.0/1"})
1533*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, '1'
1534*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 404, '1 ipv6'
15351325Saxel.duch@nginx.com
15361325Saxel.duch@nginx.com        self.route_match({"source": "0.0.0.0/0"})
1537*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, '0'
1538*1596Szelenkov@nginx.com        assert get_ipv6()['status'] == 404, '0 ipv6'
15391325Saxel.duch@nginx.com
15401325Saxel.duch@nginx.com    def test_routes_source_cidr_ipv6(self):
1541*1596Szelenkov@nginx.com        assert 'success' in self.conf(
1542*1596Szelenkov@nginx.com            {
1543*1596Szelenkov@nginx.com                "[::1]:7080": {"pass": "routes"},
1544*1596Szelenkov@nginx.com                "127.0.0.1:7081": {"pass": "routes"},
1545*1596Szelenkov@nginx.com            },
1546*1596Szelenkov@nginx.com            'listeners',
1547*1596Szelenkov@nginx.com        ), 'source listeners configure'
15481325Saxel.duch@nginx.com
15491325Saxel.duch@nginx.com        self.route_match({"source": "::1/128"})
1550*1596Szelenkov@nginx.com        assert self.get(sock_type='ipv6')['status'] == 200, '128'
1551*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, '128 ipv4'
15521325Saxel.duch@nginx.com
15531325Saxel.duch@nginx.com        self.route_match({"source": "::0/128"})
1554*1596Szelenkov@nginx.com        assert self.get(sock_type='ipv6')['status'] == 404, '128 2'
1555*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, '128 ipv4'
15561325Saxel.duch@nginx.com
15571325Saxel.duch@nginx.com        self.route_match({"source": "::0/127"})
1558*1596Szelenkov@nginx.com        assert self.get(sock_type='ipv6')['status'] == 200, '127'
1559*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, '127 ipv4'
15601325Saxel.duch@nginx.com
15611325Saxel.duch@nginx.com        self.route_match({"source": "::0/32"})
1562*1596Szelenkov@nginx.com        assert self.get(sock_type='ipv6')['status'] == 200, '32'
1563*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, '32 ipv4'
15641325Saxel.duch@nginx.com
15651325Saxel.duch@nginx.com        self.route_match({"source": "::0/1"})
1566*1596Szelenkov@nginx.com        assert self.get(sock_type='ipv6')['status'] == 200, '1'
1567*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, '1 ipv4'
15681325Saxel.duch@nginx.com
15691325Saxel.duch@nginx.com        self.route_match({"source": "::/0"})
1570*1596Szelenkov@nginx.com        assert self.get(sock_type='ipv6')['status'] == 200, '0'
1571*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, '0 ipv4'
15721325Saxel.duch@nginx.com
15731325Saxel.duch@nginx.com    def test_routes_source_unix(self):
1574*1596Szelenkov@nginx.com        addr = self.temp_dir + '/sock'
15751325Saxel.duch@nginx.com
1576*1596Szelenkov@nginx.com        assert 'success' in self.conf(
1577*1596Szelenkov@nginx.com            {"unix:" + addr: {"pass": "routes"}}, 'listeners'
1578*1596Szelenkov@nginx.com        ), 'source listeners configure'
15791325Saxel.duch@nginx.com
15801325Saxel.duch@nginx.com        self.route_match({"source": "!0.0.0.0/0"})
1581*1596Szelenkov@nginx.com        assert (
1582*1596Szelenkov@nginx.com            self.get(sock_type='unix', addr=addr)['status'] == 200
1583*1596Szelenkov@nginx.com        ), 'unix ipv4'
15841325Saxel.duch@nginx.com
15851325Saxel.duch@nginx.com        self.route_match({"source": "!::/0"})
1586*1596Szelenkov@nginx.com        assert (
1587*1596Szelenkov@nginx.com            self.get(sock_type='unix', addr=addr)['status'] == 200
1588*1596Szelenkov@nginx.com        ), 'unix ipv6'
15891325Saxel.duch@nginx.com
15901325Saxel.duch@nginx.com    def test_routes_match_source(self):
15911325Saxel.duch@nginx.com        self.route_match({"source": "::"})
15921325Saxel.duch@nginx.com        self.route_match(
15931325Saxel.duch@nginx.com            {
15941325Saxel.duch@nginx.com                "source": [
15951325Saxel.duch@nginx.com                    "127.0.0.1",
15961325Saxel.duch@nginx.com                    "192.168.0.10:8080",
15971325Saxel.duch@nginx.com                    "192.168.0.11:8080-8090",
15981325Saxel.duch@nginx.com                ]
15991325Saxel.duch@nginx.com            }
16001325Saxel.duch@nginx.com        )
16011325Saxel.duch@nginx.com        self.route_match(
16021325Saxel.duch@nginx.com            {
16031325Saxel.duch@nginx.com                "source": [
16041325Saxel.duch@nginx.com                    "10.0.0.0/8",
16051325Saxel.duch@nginx.com                    "10.0.0.0/7:1000",
16061325Saxel.duch@nginx.com                    "10.0.0.0/32:8080-8090",
16071325Saxel.duch@nginx.com                ]
16081325Saxel.duch@nginx.com            }
16091325Saxel.duch@nginx.com        )
16101325Saxel.duch@nginx.com        self.route_match(
16111325Saxel.duch@nginx.com            {
16121325Saxel.duch@nginx.com                "source": [
16131325Saxel.duch@nginx.com                    "10.0.0.0-10.0.0.1",
16141325Saxel.duch@nginx.com                    "10.0.0.0-11.0.0.0:1000",
16151325Saxel.duch@nginx.com                    "127.0.0.0-127.0.0.255:8080-8090",
16161325Saxel.duch@nginx.com                ]
16171325Saxel.duch@nginx.com            }
16181325Saxel.duch@nginx.com        )
16191325Saxel.duch@nginx.com        self.route_match(
16201325Saxel.duch@nginx.com            {"source": ["2001::", "[2002::]:8000", "[2003::]:8080-8090"]}
16211325Saxel.duch@nginx.com        )
16221325Saxel.duch@nginx.com        self.route_match(
16231325Saxel.duch@nginx.com            {
16241325Saxel.duch@nginx.com                "source": [
16251325Saxel.duch@nginx.com                    "2001::-200f:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
16261325Saxel.duch@nginx.com                    "[fe08::-feff::]:8000",
16271325Saxel.duch@nginx.com                    "[fff0::-fff0::10]:8080-8090",
16281325Saxel.duch@nginx.com                ]
16291325Saxel.duch@nginx.com            }
16301325Saxel.duch@nginx.com        )
16311325Saxel.duch@nginx.com        self.route_match(
16321325Saxel.duch@nginx.com            {
16331325Saxel.duch@nginx.com                "source": [
16341325Saxel.duch@nginx.com                    "2001::/16",
16351325Saxel.duch@nginx.com                    "[0ff::/64]:8000",
16361325Saxel.duch@nginx.com                    "[fff0:abcd:ffff:ffff:ffff::/128]:8080-8090",
16371325Saxel.duch@nginx.com                ]
16381325Saxel.duch@nginx.com            }
16391325Saxel.duch@nginx.com        )
16401325Saxel.duch@nginx.com        self.route_match({"source": "*:0-65535"})
1641*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'source any'
16421325Saxel.duch@nginx.com
16431325Saxel.duch@nginx.com    def test_routes_match_source_invalid(self):
16441325Saxel.duch@nginx.com        self.route_match_invalid({"source": "127"})
16451325Saxel.duch@nginx.com        self.route_match_invalid({"source": "256.0.0.1"})
16461325Saxel.duch@nginx.com        self.route_match_invalid({"source": "127.0.0."})
16471391Szelenkov@nginx.com        self.route_match_invalid({"source": " 127.0.0.1"})
16481325Saxel.duch@nginx.com        self.route_match_invalid({"source": "127.0.0.1:"})
16491325Saxel.duch@nginx.com        self.route_match_invalid({"source": "127.0.0.1/"})
16501325Saxel.duch@nginx.com        self.route_match_invalid({"source": "11.0.0.0/33"})
16511325Saxel.duch@nginx.com        self.route_match_invalid({"source": "11.0.0.0/65536"})
16521325Saxel.duch@nginx.com        self.route_match_invalid({"source": "11.0.0.0-10.0.0.0"})
16531325Saxel.duch@nginx.com        self.route_match_invalid({"source": "11.0.0.0:3000-2000"})
16541325Saxel.duch@nginx.com        self.route_match_invalid({"source": ["11.0.0.0:3000-2000"]})
16551325Saxel.duch@nginx.com        self.route_match_invalid({"source": "[2001::]:3000-2000"})
16561325Saxel.duch@nginx.com        self.route_match_invalid({"source": "2001::-2000::"})
16571325Saxel.duch@nginx.com        self.route_match_invalid({"source": "2001::/129"})
16581325Saxel.duch@nginx.com        self.route_match_invalid({"source": "::FFFFF"})
16591325Saxel.duch@nginx.com        self.route_match_invalid({"source": "[::1]:"})
16601370Szelenkov@nginx.com        self.route_match_invalid({"source": "[:::]:7080"})
16611325Saxel.duch@nginx.com        self.route_match_invalid({"source": "*:"})
16621325Saxel.duch@nginx.com        self.route_match_invalid({"source": "*:1-a"})
16631325Saxel.duch@nginx.com        self.route_match_invalid({"source": "*:65536"})
16641325Saxel.duch@nginx.com
16651327Saxel.duch@nginx.com    def test_routes_match_destination(self):
1666*1596Szelenkov@nginx.com        assert 'success' in self.conf(
1667*1596Szelenkov@nginx.com            {"*:7080": {"pass": "routes"}, "*:7081": {"pass": "routes"}},
1668*1596Szelenkov@nginx.com            'listeners',
1669*1596Szelenkov@nginx.com        ), 'listeners configure'
16701327Saxel.duch@nginx.com
16711327Saxel.duch@nginx.com        self.route_match({"destination": "*:7080"})
1672*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'dest'
1673*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, 'dest 2'
16741327Saxel.duch@nginx.com
16751327Saxel.duch@nginx.com        self.route_match({"destination": ["127.0.0.1:7080"]})
1676*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'dest 3'
1677*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, 'dest 4'
16781327Saxel.duch@nginx.com
16791327Saxel.duch@nginx.com        self.route_match({"destination": "!*:7080"})
1680*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'dest neg'
1681*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 200, 'dest neg 2'
16821327Saxel.duch@nginx.com
16831391Szelenkov@nginx.com        self.route_match({"destination": ['!*:7080', '!*:7081']})
1684*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'dest neg 3'
1685*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, 'dest neg 4'
16861391Szelenkov@nginx.com
16871391Szelenkov@nginx.com        self.route_match({"destination": ['!*:7081', '!*:7082']})
1688*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'dest neg 5'
16891391Szelenkov@nginx.com
16901391Szelenkov@nginx.com        self.route_match({"destination": ['*:7080', '!*:7080']})
1691*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'dest neg 6'
16921391Szelenkov@nginx.com
16931391Szelenkov@nginx.com        self.route_match(
16941391Szelenkov@nginx.com            {"destination": ['127.0.0.1:7080', '*:7081', '!*:7080']}
16951391Szelenkov@nginx.com        )
1696*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'dest neg 7'
1697*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 200, 'dest neg 8'
16981391Szelenkov@nginx.com
16991391Szelenkov@nginx.com        self.route_match({"destination": ['!*:7081', '!*:7082', '*:7083']})
1700*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'dest neg 9'
17011391Szelenkov@nginx.com
17021391Szelenkov@nginx.com        self.route_match(
17031391Szelenkov@nginx.com            {"destination": ['*:7081', '!127.0.0.1:7080', '*:7080']}
17041391Szelenkov@nginx.com        )
1705*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'dest neg 10'
1706*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 200, 'dest neg 11'
17071391Szelenkov@nginx.com
1708*1596Szelenkov@nginx.com        assert 'success' in self.conf_delete(
1709*1596Szelenkov@nginx.com            'routes/0/match/destination/0'
1710*1596Szelenkov@nginx.com        ), 'remove destination rule'
1711*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'dest neg 12'
1712*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, 'dest neg 13'
17131391Szelenkov@nginx.com
1714*1596Szelenkov@nginx.com        assert 'success' in self.conf_delete(
1715*1596Szelenkov@nginx.com            'routes/0/match/destination/0'
1716*1596Szelenkov@nginx.com        ), 'remove destination rule 2'
1717*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'dest neg 14'
1718*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, 'dest neg 15'
17191391Szelenkov@nginx.com
1720*1596Szelenkov@nginx.com        assert 'success' in self.conf_post(
1721*1596Szelenkov@nginx.com            "\"!127.0.0.1\"", 'routes/0/match/destination'
1722*1596Szelenkov@nginx.com        ), 'add destination rule'
1723*1596Szelenkov@nginx.com        assert self.get()['status'] == 404, 'dest neg 16'
1724*1596Szelenkov@nginx.com        assert self.get(port=7081)['status'] == 404, 'dest neg 17'
17251391Szelenkov@nginx.com
17261327Saxel.duch@nginx.com    def test_routes_match_destination_proxy(self):
1727*1596Szelenkov@nginx.com        assert 'success' in self.conf(
1728*1596Szelenkov@nginx.com            {
1729*1596Szelenkov@nginx.com                "listeners": {
1730*1596Szelenkov@nginx.com                    "*:7080": {"pass": "routes/first"},
1731*1596Szelenkov@nginx.com                    "*:7081": {"pass": "routes/second"},
1732*1596Szelenkov@nginx.com                },
1733*1596Szelenkov@nginx.com                "routes": {
1734*1596Szelenkov@nginx.com                    "first": [{"action": {"proxy": "http://127.0.0.1:7081"}}],
1735*1596Szelenkov@nginx.com                    "second": [
1736*1596Szelenkov@nginx.com                        {
1737*1596Szelenkov@nginx.com                            "match": {"destination": ["127.0.0.1:7081"]},
1738*1596Szelenkov@nginx.com                            "action": {"return": 200},
1739*1596Szelenkov@nginx.com                        }
1740*1596Szelenkov@nginx.com                    ],
1741*1596Szelenkov@nginx.com                },
1742*1596Szelenkov@nginx.com                "applications": {},
1743*1596Szelenkov@nginx.com            }
1744*1596Szelenkov@nginx.com        ), 'proxy configure'
17451327Saxel.duch@nginx.com
1746*1596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'proxy'
1747