xref: /unit/test/test_routing.py (revision 1478)
11475Saxel.duch@nginx.com# -*- coding: utf-8 -*-
21477Szelenkov@nginx.comimport unittest
31475Saxel.duch@nginx.com
41019Szelenkov@nginx.comfrom unit.applications.proto import TestApplicationProto
5972Szelenkov@nginx.com
61017Szelenkov@nginx.com
71019Szelenkov@nginx.comclass TestRouting(TestApplicationProto):
81467Szelenkov@nginx.com    prerequisites = {'modules': {'python': 'any'}}
9972Szelenkov@nginx.com
10972Szelenkov@nginx.com    def setUp(self):
11972Szelenkov@nginx.com        super().setUp()
12972Szelenkov@nginx.com
131243Szelenkov@nginx.com        self.assertIn(
141243Szelenkov@nginx.com            'success',
151243Szelenkov@nginx.com            self.conf(
161243Szelenkov@nginx.com                {
171243Szelenkov@nginx.com                    "listeners": {"*:7080": {"pass": "routes"}},
181243Szelenkov@nginx.com                    "routes": [
191243Szelenkov@nginx.com                        {
201243Szelenkov@nginx.com                            "match": {"method": "GET"},
211434Szelenkov@nginx.com                            "action": {"return": 200},
221243Szelenkov@nginx.com                        }
231243Szelenkov@nginx.com                    ],
241434Szelenkov@nginx.com                    "applications": {},
251243Szelenkov@nginx.com                }
261243Szelenkov@nginx.com            ),
271243Szelenkov@nginx.com            'routing configure',
281017Szelenkov@nginx.com        )
29972Szelenkov@nginx.com
301101Szelenkov@nginx.com    def route(self, route):
311101Szelenkov@nginx.com        return self.conf([route], 'routes')
321101Szelenkov@nginx.com
331308Szelenkov@nginx.com    def route_match(self, match):
341037Szelenkov@nginx.com        self.assertIn(
351037Szelenkov@nginx.com            'success',
361434Szelenkov@nginx.com            self.route({"match": match, "action": {"return": 200}}),
371308Szelenkov@nginx.com            'route match configure',
381037Szelenkov@nginx.com        )
391037Szelenkov@nginx.com
401308Szelenkov@nginx.com    def route_match_invalid(self, match):
411308Szelenkov@nginx.com        self.assertIn(
421308Szelenkov@nginx.com            'error',
431434Szelenkov@nginx.com            self.route({"match": match, "action": {"return": 200}}),
441308Szelenkov@nginx.com            'route match configure invalid',
451037Szelenkov@nginx.com        )
461037Szelenkov@nginx.com
471308Szelenkov@nginx.com    def host(self, host, status):
481037Szelenkov@nginx.com        self.assertEqual(
491308Szelenkov@nginx.com            self.get(headers={'Host': host, 'Connection': 'close'})[
501037Szelenkov@nginx.com                'status'
511037Szelenkov@nginx.com            ],
521308Szelenkov@nginx.com            status,
531308Szelenkov@nginx.com            'match host',
541308Szelenkov@nginx.com        )
551308Szelenkov@nginx.com
561308Szelenkov@nginx.com    def cookie(self, cookie, status):
571308Szelenkov@nginx.com        self.assertEqual(
581308Szelenkov@nginx.com            self.get(
591308Szelenkov@nginx.com                headers={
601308Szelenkov@nginx.com                    'Host': 'localhost',
611308Szelenkov@nginx.com                    'Cookie': cookie,
621308Szelenkov@nginx.com                    'Connection': 'close',
631308Szelenkov@nginx.com                },
641308Szelenkov@nginx.com            )['status'],
651308Szelenkov@nginx.com            status,
661308Szelenkov@nginx.com            'match cookie',
671037Szelenkov@nginx.com        )
681037Szelenkov@nginx.com
691308Szelenkov@nginx.com    def test_routes_match_method_positive(self):
701308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'GET')
711308Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 404, 'POST')
721308Szelenkov@nginx.com
731308Szelenkov@nginx.com    def test_routes_match_method_positive_many(self):
741308Szelenkov@nginx.com        self.route_match({"method": ["GET", "POST"]})
751308Szelenkov@nginx.com
761308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'GET')
771308Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 200, 'POST')
781308Szelenkov@nginx.com        self.assertEqual(self.delete()['status'], 404, 'DELETE')
791308Szelenkov@nginx.com
801308Szelenkov@nginx.com    def test_routes_match_method_negative(self):
811308Szelenkov@nginx.com        self.route_match({"method": "!GET"})
821308Szelenkov@nginx.com
831308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'GET')
841308Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 200, 'POST')
851308Szelenkov@nginx.com
861308Szelenkov@nginx.com    def test_routes_match_method_negative_many(self):
871308Szelenkov@nginx.com        self.route_match({"method": ["!GET", "!POST"]})
881308Szelenkov@nginx.com
891308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'GET')
901308Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 404, 'POST')
911308Szelenkov@nginx.com        self.assertEqual(self.delete()['status'], 200, 'DELETE')
921308Szelenkov@nginx.com
931308Szelenkov@nginx.com    def test_routes_match_method_wildcard_left(self):
941308Szelenkov@nginx.com        self.route_match({"method": "*ET"})
951308Szelenkov@nginx.com
961308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'GET')
971308Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 404, 'POST')
981037Szelenkov@nginx.com
991308Szelenkov@nginx.com    def test_routes_match_method_wildcard_right(self):
1001308Szelenkov@nginx.com        self.route_match({"method": "GE*"})
1011308Szelenkov@nginx.com
1021308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'GET')
1031308Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 404, 'POST')
1041308Szelenkov@nginx.com
1051308Szelenkov@nginx.com    def test_routes_match_method_wildcard_left_right(self):
1061308Szelenkov@nginx.com        self.route_match({"method": "*GET*"})
1071308Szelenkov@nginx.com
1081308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'GET')
1091308Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 404, 'POST')
1101308Szelenkov@nginx.com
1111308Szelenkov@nginx.com    def test_routes_match_method_wildcard(self):
1121308Szelenkov@nginx.com        self.route_match({"method": "*"})
1131308Szelenkov@nginx.com
1141308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'GET')
1151308Szelenkov@nginx.com
1161308Szelenkov@nginx.com    def test_routes_match_invalid(self):
1171308Szelenkov@nginx.com        self.route_match_invalid({"method": "**"})
1181308Szelenkov@nginx.com        self.route_match_invalid({"method": "blah**"})
1191308Szelenkov@nginx.com        self.route_match_invalid({"host": "*blah*blah"})
1201308Szelenkov@nginx.com        self.route_match_invalid({"host": "blah*blah*blah"})
1211308Szelenkov@nginx.com        self.route_match_invalid({"host": "blah*blah*"})
1221308Szelenkov@nginx.com
1231308Szelenkov@nginx.com    def test_routes_match_wildcard_middle(self):
1241308Szelenkov@nginx.com        self.route_match({"host": "ex*le"})
1251308Szelenkov@nginx.com
1261308Szelenkov@nginx.com        self.host('example', 200)
1271308Szelenkov@nginx.com        self.host('www.example', 404)
1281308Szelenkov@nginx.com        self.host('example.com', 404)
1291308Szelenkov@nginx.com        self.host('exampl', 404)
1301037Szelenkov@nginx.com
131972Szelenkov@nginx.com    def test_routes_match_method_case_insensitive(self):
1321308Szelenkov@nginx.com        self.route_match({"method": "get"})
133972Szelenkov@nginx.com
1341308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'GET')
135972Szelenkov@nginx.com
1361037Szelenkov@nginx.com    def test_routes_match_wildcard_left_case_insensitive(self):
1371308Szelenkov@nginx.com        self.route_match({"method": "*get"})
1381308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'GET')
1391037Szelenkov@nginx.com
1401308Szelenkov@nginx.com        self.route_match({"method": "*et"})
1411308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'GET')
1421037Szelenkov@nginx.com
1431037Szelenkov@nginx.com    def test_routes_match_wildcard_middle_case_insensitive(self):
1441308Szelenkov@nginx.com        self.route_match({"method": "g*t"})
1451037Szelenkov@nginx.com
1461308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'GET')
1471037Szelenkov@nginx.com
1481037Szelenkov@nginx.com    def test_routes_match_wildcard_right_case_insensitive(self):
1491308Szelenkov@nginx.com        self.route_match({"method": "get*"})
1501308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'GET')
1511037Szelenkov@nginx.com
1521308Szelenkov@nginx.com        self.route_match({"method": "ge*"})
1531308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'GET')
1541037Szelenkov@nginx.com
1551037Szelenkov@nginx.com    def test_routes_match_wildcard_substring_case_insensitive(self):
1561308Szelenkov@nginx.com        self.route_match({"method": "*et*"})
1571037Szelenkov@nginx.com
1581308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'GET')
1591037Szelenkov@nginx.com
1601037Szelenkov@nginx.com    def test_routes_match_wildcard_left_case_sensitive(self):
1611308Szelenkov@nginx.com        self.route_match({"uri": "*blah"})
1621037Szelenkov@nginx.com
1631308Szelenkov@nginx.com        self.assertEqual(self.get(url='/blah')['status'], 200, '/blah')
1641308Szelenkov@nginx.com        self.assertEqual(self.get(url='/BLAH')['status'], 404, '/BLAH')
1651037Szelenkov@nginx.com
1661037Szelenkov@nginx.com    def test_routes_match_wildcard_middle_case_sensitive(self):
1671308Szelenkov@nginx.com        self.route_match({"uri": "/b*h"})
1681037Szelenkov@nginx.com
1691308Szelenkov@nginx.com        self.assertEqual(self.get(url='/blah')['status'], 200, '/blah')
1701308Szelenkov@nginx.com        self.assertEqual(self.get(url='/BLAH')['status'], 404, '/BLAH')
1711037Szelenkov@nginx.com
1721037Szelenkov@nginx.com    def test_routes_match_wildcard_right_case_sensitive(self):
1731308Szelenkov@nginx.com        self.route_match({"uri": "/bla*"})
1741037Szelenkov@nginx.com
1751308Szelenkov@nginx.com        self.assertEqual(self.get(url='/blah')['status'], 200, '/blah')
1761308Szelenkov@nginx.com        self.assertEqual(self.get(url='/BLAH')['status'], 404, '/BLAH')
1771037Szelenkov@nginx.com
1781037Szelenkov@nginx.com    def test_routes_match_wildcard_substring_case_sensitive(self):
1791308Szelenkov@nginx.com        self.route_match({"uri": "*bla*"})
1801037Szelenkov@nginx.com
1811308Szelenkov@nginx.com        self.assertEqual(self.get(url='/blah')['status'], 200, '/blah')
1821308Szelenkov@nginx.com        self.assertEqual(self.get(url='/BLAH')['status'], 404, '/BLAH')
1831037Szelenkov@nginx.com
184*1478Szelenkov@nginx.com    def test_routes_pass_encode(self):
185*1478Szelenkov@nginx.com        def check_pass(path, name):
186*1478Szelenkov@nginx.com            self.assertIn(
187*1478Szelenkov@nginx.com                'success',
188*1478Szelenkov@nginx.com                self.conf(
189*1478Szelenkov@nginx.com                    {
190*1478Szelenkov@nginx.com                        "listeners": {
191*1478Szelenkov@nginx.com                            "*:7080": {"pass": "applications/" + path}
192*1478Szelenkov@nginx.com                        },
193*1478Szelenkov@nginx.com                        "applications": {
194*1478Szelenkov@nginx.com                            name: {
195*1478Szelenkov@nginx.com                                "type": "python",
196*1478Szelenkov@nginx.com                                "processes": {"spare": 0},
197*1478Szelenkov@nginx.com                                "path": self.current_dir + '/python/empty',
198*1478Szelenkov@nginx.com                                "working_directory": self.current_dir
199*1478Szelenkov@nginx.com                                + '/python/empty',
200*1478Szelenkov@nginx.com                                "module": "wsgi",
201*1478Szelenkov@nginx.com                            }
202*1478Szelenkov@nginx.com                        },
203*1478Szelenkov@nginx.com                    }
204*1478Szelenkov@nginx.com                ),
205*1478Szelenkov@nginx.com            )
206*1478Szelenkov@nginx.com
207*1478Szelenkov@nginx.com            self.assertEqual(self.get()['status'], 200)
208*1478Szelenkov@nginx.com
209*1478Szelenkov@nginx.com        check_pass("%25", "%")
210*1478Szelenkov@nginx.com        check_pass("blah%2Fblah", "blah/blah")
211*1478Szelenkov@nginx.com        check_pass("%2Fblah%2F%2Fblah%2F", "/blah//blah/")
212*1478Szelenkov@nginx.com        check_pass("%20blah%252Fblah%7E", " blah%2Fblah~")
213*1478Szelenkov@nginx.com
214*1478Szelenkov@nginx.com        def check_pass_error(path, name):
215*1478Szelenkov@nginx.com            self.assertIn(
216*1478Szelenkov@nginx.com                'error',
217*1478Szelenkov@nginx.com                self.conf(
218*1478Szelenkov@nginx.com                    {
219*1478Szelenkov@nginx.com                        "listeners": {
220*1478Szelenkov@nginx.com                            "*:7080": {"pass": "applications/" + path}
221*1478Szelenkov@nginx.com                        },
222*1478Szelenkov@nginx.com                        "applications": {
223*1478Szelenkov@nginx.com                            name: {
224*1478Szelenkov@nginx.com                                "type": "python",
225*1478Szelenkov@nginx.com                                "processes": {"spare": 0},
226*1478Szelenkov@nginx.com                                "path": self.current_dir + '/python/empty',
227*1478Szelenkov@nginx.com                                "working_directory": self.current_dir
228*1478Szelenkov@nginx.com                                + '/python/empty',
229*1478Szelenkov@nginx.com                                "module": "wsgi",
230*1478Szelenkov@nginx.com                            }
231*1478Szelenkov@nginx.com                        },
232*1478Szelenkov@nginx.com                    }
233*1478Szelenkov@nginx.com                ),
234*1478Szelenkov@nginx.com            )
235*1478Szelenkov@nginx.com
236*1478Szelenkov@nginx.com        check_pass_error("%", "%")
237*1478Szelenkov@nginx.com        check_pass_error("%1", "%1")
238*1478Szelenkov@nginx.com
239972Szelenkov@nginx.com    def test_routes_absent(self):
2401017Szelenkov@nginx.com        self.conf(
2411017Szelenkov@nginx.com            {
2421017Szelenkov@nginx.com                "listeners": {"*:7081": {"pass": "applications/empty"}},
2431017Szelenkov@nginx.com                "applications": {
2441017Szelenkov@nginx.com                    "empty": {
2451017Szelenkov@nginx.com                        "type": "python",
2461017Szelenkov@nginx.com                        "processes": {"spare": 0},
2471017Szelenkov@nginx.com                        "path": self.current_dir + '/python/empty',
2481017Szelenkov@nginx.com                        "working_directory": self.current_dir
2491017Szelenkov@nginx.com                        + '/python/empty',
2501017Szelenkov@nginx.com                        "module": "wsgi",
2511017Szelenkov@nginx.com                    }
2521017Szelenkov@nginx.com                },
253972Szelenkov@nginx.com            }
2541017Szelenkov@nginx.com        )
255972Szelenkov@nginx.com
256972Szelenkov@nginx.com        self.assertEqual(self.get(port=7081)['status'], 200, 'routes absent')
257972Szelenkov@nginx.com
258972Szelenkov@nginx.com    def test_routes_pass_invalid(self):
2591017Szelenkov@nginx.com        self.assertIn(
2601017Szelenkov@nginx.com            'error',
2611017Szelenkov@nginx.com            self.conf({"pass": "routes/blah"}, 'listeners/*:7080'),
2621017Szelenkov@nginx.com            'routes invalid',
2631017Szelenkov@nginx.com        )
264972Szelenkov@nginx.com
265972Szelenkov@nginx.com    def test_route_empty(self):
2661017Szelenkov@nginx.com        self.assertIn(
2671017Szelenkov@nginx.com            'success',
2681017Szelenkov@nginx.com            self.conf(
2691017Szelenkov@nginx.com                {
2701017Szelenkov@nginx.com                    "listeners": {"*:7080": {"pass": "routes/main"}},
2711017Szelenkov@nginx.com                    "routes": {"main": []},
2721434Szelenkov@nginx.com                    "applications": {},
273972Szelenkov@nginx.com                }
2741017Szelenkov@nginx.com            ),
2751017Szelenkov@nginx.com            'route empty configure',
2761017Szelenkov@nginx.com        )
277972Szelenkov@nginx.com
278972Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'route empty')
279972Szelenkov@nginx.com
280972Szelenkov@nginx.com    def test_routes_route_empty(self):
2811017Szelenkov@nginx.com        self.assertIn(
2821017Szelenkov@nginx.com            'success',
2831017Szelenkov@nginx.com            self.conf({}, 'listeners'),
2841017Szelenkov@nginx.com            'routes empty listeners configure',
2851017Szelenkov@nginx.com        )
286972Szelenkov@nginx.com
2871017Szelenkov@nginx.com        self.assertIn(
2881017Szelenkov@nginx.com            'success', self.conf({}, 'routes'), 'routes empty configure'
2891017Szelenkov@nginx.com        )
290972Szelenkov@nginx.com
291972Szelenkov@nginx.com    def test_routes_route_match_absent(self):
2921017Szelenkov@nginx.com        self.assertIn(
2931017Szelenkov@nginx.com            'success',
2941434Szelenkov@nginx.com            self.conf([{"action": {"return": 200}}], 'routes'),
2951017Szelenkov@nginx.com            'route match absent configure',
2961017Szelenkov@nginx.com        )
297972Szelenkov@nginx.com
298972Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'route match absent')
299972Szelenkov@nginx.com
300972Szelenkov@nginx.com    def test_routes_route_action_absent(self):
301972Szelenkov@nginx.com        self.skip_alerts.append(r'failed to apply new conf')
302972Szelenkov@nginx.com
3031017Szelenkov@nginx.com        self.assertIn(
3041017Szelenkov@nginx.com            'error',
3051017Szelenkov@nginx.com            self.conf([{"match": {"method": "GET"}}], 'routes'),
3061017Szelenkov@nginx.com            'route pass absent configure',
3071017Szelenkov@nginx.com        )
308972Szelenkov@nginx.com
309972Szelenkov@nginx.com    def test_routes_route_pass_absent(self):
3101017Szelenkov@nginx.com        self.assertIn(
3111017Szelenkov@nginx.com            'error',
3121017Szelenkov@nginx.com            self.conf([{"match": {"method": "GET"}, "action": {}}], 'routes'),
3131017Szelenkov@nginx.com            'route pass absent configure',
3141017Szelenkov@nginx.com        )
315972Szelenkov@nginx.com
3161379Szelenkov@nginx.com    def test_routes_action_unique(self):
3171379Szelenkov@nginx.com        self.assertIn(
3181379Szelenkov@nginx.com            'success',
3191379Szelenkov@nginx.com            self.conf(
3201379Szelenkov@nginx.com                {
3211379Szelenkov@nginx.com                    "listeners": {
3221379Szelenkov@nginx.com                        "*:7080": {"pass": "routes"},
3231379Szelenkov@nginx.com                        "*:7081": {"pass": "applications/app"},
3241379Szelenkov@nginx.com                    },
3251379Szelenkov@nginx.com                    "routes": [{"action": {"proxy": "http://127.0.0.1:7081"}}],
3261379Szelenkov@nginx.com                    "applications": {
3271379Szelenkov@nginx.com                        "app": {
3281379Szelenkov@nginx.com                            "type": "python",
3291379Szelenkov@nginx.com                            "processes": {"spare": 0},
3301379Szelenkov@nginx.com                            "path": "/app",
3311379Szelenkov@nginx.com                            "module": "wsgi",
3321379Szelenkov@nginx.com                        }
3331379Szelenkov@nginx.com                    },
3341379Szelenkov@nginx.com                }
3351379Szelenkov@nginx.com            ),
3361379Szelenkov@nginx.com        )
3371379Szelenkov@nginx.com
3381379Szelenkov@nginx.com        self.assertIn(
3391379Szelenkov@nginx.com            'error',
3401379Szelenkov@nginx.com            self.conf(
3411379Szelenkov@nginx.com                {"proxy": "http://127.0.0.1:7081", "share": self.testdir},
3421379Szelenkov@nginx.com                'routes/0/action',
3431379Szelenkov@nginx.com            ),
3441379Szelenkov@nginx.com            'proxy share',
3451379Szelenkov@nginx.com        )
3461379Szelenkov@nginx.com        self.assertIn(
3471379Szelenkov@nginx.com            'error',
3481379Szelenkov@nginx.com            self.conf(
3491379Szelenkov@nginx.com                {
3501379Szelenkov@nginx.com                    "proxy": "http://127.0.0.1:7081",
3511379Szelenkov@nginx.com                    "pass": "applications/app",
3521379Szelenkov@nginx.com                },
3531379Szelenkov@nginx.com                'routes/0/action',
3541379Szelenkov@nginx.com            ),
3551379Szelenkov@nginx.com            'proxy pass',
3561379Szelenkov@nginx.com        )
3571379Szelenkov@nginx.com        self.assertIn(
3581379Szelenkov@nginx.com            'error',
3591379Szelenkov@nginx.com            self.conf(
3601379Szelenkov@nginx.com                {"share": self.testdir, "pass": "applications/app"},
3611379Szelenkov@nginx.com                'routes/0/action',
3621379Szelenkov@nginx.com            ),
3631379Szelenkov@nginx.com            'share pass',
3641379Szelenkov@nginx.com        )
3651379Szelenkov@nginx.com
366972Szelenkov@nginx.com    def test_routes_rules_two(self):
3671017Szelenkov@nginx.com        self.assertIn(
3681017Szelenkov@nginx.com            'success',
3691017Szelenkov@nginx.com            self.conf(
3701017Szelenkov@nginx.com                [
3711434Szelenkov@nginx.com                    {"match": {"method": "GET"}, "action": {"return": 200}},
3721434Szelenkov@nginx.com                    {"match": {"method": "POST"}, "action": {"return": 201}},
3731017Szelenkov@nginx.com                ],
3741017Szelenkov@nginx.com                'routes',
3751017Szelenkov@nginx.com            ),
3761017Szelenkov@nginx.com            'rules two configure',
3771017Szelenkov@nginx.com        )
378972Szelenkov@nginx.com
379972Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'rules two match first')
3801434Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 201, 'rules two match second')
381972Szelenkov@nginx.com
382972Szelenkov@nginx.com    def test_routes_two(self):
3831017Szelenkov@nginx.com        self.assertIn(
3841017Szelenkov@nginx.com            'success',
3851017Szelenkov@nginx.com            self.conf(
3861017Szelenkov@nginx.com                {
3871017Szelenkov@nginx.com                    "listeners": {"*:7080": {"pass": "routes/first"}},
3881017Szelenkov@nginx.com                    "routes": {
3891017Szelenkov@nginx.com                        "first": [
3901017Szelenkov@nginx.com                            {
3911017Szelenkov@nginx.com                                "match": {"method": "GET"},
3921017Szelenkov@nginx.com                                "action": {"pass": "routes/second"},
3931017Szelenkov@nginx.com                            }
3941017Szelenkov@nginx.com                        ],
3951017Szelenkov@nginx.com                        "second": [
3961017Szelenkov@nginx.com                            {
3971017Szelenkov@nginx.com                                "match": {"host": "localhost"},
3981434Szelenkov@nginx.com                                "action": {"return": 200},
3991017Szelenkov@nginx.com                            }
4001017Szelenkov@nginx.com                        ],
4011017Szelenkov@nginx.com                    },
4021434Szelenkov@nginx.com                    "applications": {},
403972Szelenkov@nginx.com                }
4041017Szelenkov@nginx.com            ),
4051017Szelenkov@nginx.com            'routes two configure',
4061017Szelenkov@nginx.com        )
407972Szelenkov@nginx.com
408972Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'routes two')
409972Szelenkov@nginx.com
410972Szelenkov@nginx.com    def test_routes_match_host_positive(self):
4111308Szelenkov@nginx.com        self.route_match({"host": "localhost"})
412972Szelenkov@nginx.com
4131308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'localhost')
4141308Szelenkov@nginx.com        self.host('localhost.', 200)
4151308Szelenkov@nginx.com        self.host('localhost.', 200)
4161308Szelenkov@nginx.com        self.host('.localhost', 404)
4171308Szelenkov@nginx.com        self.host('www.localhost', 404)
4181308Szelenkov@nginx.com        self.host('localhost1', 404)
419972Szelenkov@nginx.com
4201065Szelenkov@nginx.com    @unittest.skip('not yet')
4211065Szelenkov@nginx.com    def test_routes_match_host_absent(self):
4221308Szelenkov@nginx.com        self.route_match({"host": "localhost"})
4231065Szelenkov@nginx.com
4241065Szelenkov@nginx.com        self.assertEqual(
4251065Szelenkov@nginx.com            self.get(headers={'Connection': 'close'})['status'],
4261065Szelenkov@nginx.com            400,
4271065Szelenkov@nginx.com            'match host absent',
4281065Szelenkov@nginx.com        )
4291065Szelenkov@nginx.com
430972Szelenkov@nginx.com    def test_routes_match_host_ipv4(self):
4311308Szelenkov@nginx.com        self.route_match({"host": "127.0.0.1"})
432972Szelenkov@nginx.com
4331308Szelenkov@nginx.com        self.host('127.0.0.1', 200)
4341308Szelenkov@nginx.com        self.host('127.0.0.1:7080', 200)
435972Szelenkov@nginx.com
436972Szelenkov@nginx.com    def test_routes_match_host_ipv6(self):
4371308Szelenkov@nginx.com        self.route_match({"host": "[::1]"})
438972Szelenkov@nginx.com
4391308Szelenkov@nginx.com        self.host('[::1]', 200)
4401308Szelenkov@nginx.com        self.host('[::1]:7080', 200)
441972Szelenkov@nginx.com
442972Szelenkov@nginx.com    def test_routes_match_host_positive_many(self):
4431308Szelenkov@nginx.com        self.route_match({"host": ["localhost", "example.com"]})
444972Szelenkov@nginx.com
4451308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'localhost')
4461308Szelenkov@nginx.com        self.host('example.com', 200)
447972Szelenkov@nginx.com
448972Szelenkov@nginx.com    def test_routes_match_host_positive_and_negative(self):
4491308Szelenkov@nginx.com        self.route_match({"host": ["*example.com", "!www.example.com"]})
450972Szelenkov@nginx.com
4511308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'localhost')
4521308Szelenkov@nginx.com        self.host('example.com', 200)
4531308Szelenkov@nginx.com        self.host('www.example.com', 404)
4541308Szelenkov@nginx.com        self.host('!www.example.com', 200)
455972Szelenkov@nginx.com
456972Szelenkov@nginx.com    def test_routes_match_host_positive_and_negative_wildcard(self):
4571308Szelenkov@nginx.com        self.route_match({"host": ["*example*", "!www.example*"]})
458972Szelenkov@nginx.com
4591308Szelenkov@nginx.com        self.host('example.com', 200)
4601308Szelenkov@nginx.com        self.host('www.example.com', 404)
461972Szelenkov@nginx.com
462972Szelenkov@nginx.com    def test_routes_match_host_case_insensitive(self):
4631308Szelenkov@nginx.com        self.route_match({"host": "Example.com"})
464972Szelenkov@nginx.com
4651308Szelenkov@nginx.com        self.host('example.com', 200)
4661308Szelenkov@nginx.com        self.host('EXAMPLE.COM', 200)
467972Szelenkov@nginx.com
468972Szelenkov@nginx.com    def test_routes_match_host_port(self):
4691308Szelenkov@nginx.com        self.route_match({"host": "example.com"})
470972Szelenkov@nginx.com
4711308Szelenkov@nginx.com        self.host('example.com:7080', 200)
472972Szelenkov@nginx.com
4731053Szelenkov@nginx.com    def test_routes_match_host_empty(self):
4741308Szelenkov@nginx.com        self.route_match({"host": ""})
4751053Szelenkov@nginx.com
4761308Szelenkov@nginx.com        self.host('', 200)
4771053Szelenkov@nginx.com        self.assertEqual(
4781053Szelenkov@nginx.com            self.get(http_10=True, headers={})['status'],
4791053Szelenkov@nginx.com            200,
4801053Szelenkov@nginx.com            'match host empty 2',
4811053Szelenkov@nginx.com        )
4821065Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'match host empty 3')
4831053Szelenkov@nginx.com
484972Szelenkov@nginx.com    def test_routes_match_uri_positive(self):
4851308Szelenkov@nginx.com        self.route_match({"uri": ["/blah", "/slash/"]})
486972Szelenkov@nginx.com
4871308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, '/')
4881308Szelenkov@nginx.com        self.assertEqual(self.get(url='/blah')['status'], 200, '/blah')
4891308Szelenkov@nginx.com        self.assertEqual(self.get(url='/blah#foo')['status'], 200, '/blah#foo')
4901308Szelenkov@nginx.com        self.assertEqual(self.get(url='/blah?var')['status'], 200, '/blah?var')
4911308Szelenkov@nginx.com        self.assertEqual(self.get(url='//blah')['status'], 200, '//blah')
4921249Szelenkov@nginx.com        self.assertEqual(
4931308Szelenkov@nginx.com            self.get(url='/slash/foo/../')['status'], 200, 'relative'
4941249Szelenkov@nginx.com        )
4951308Szelenkov@nginx.com        self.assertEqual(self.get(url='/slash/./')['status'], 200, '/slash/./')
4961017Szelenkov@nginx.com        self.assertEqual(
4971308Szelenkov@nginx.com            self.get(url='/slash//.//')['status'], 200, 'adjacent slashes'
4981249Szelenkov@nginx.com        )
4991308Szelenkov@nginx.com        self.assertEqual(self.get(url='/%')['status'], 400, 'percent')
5001308Szelenkov@nginx.com        self.assertEqual(self.get(url='/%1')['status'], 400, 'percent digit')
5011308Szelenkov@nginx.com        self.assertEqual(self.get(url='/%A')['status'], 400, 'percent letter')
5021249Szelenkov@nginx.com        self.assertEqual(
5031308Szelenkov@nginx.com            self.get(url='/slash/.?args')['status'], 200, 'dot args'
5041249Szelenkov@nginx.com        )
5051249Szelenkov@nginx.com        self.assertEqual(
5061308Szelenkov@nginx.com            self.get(url='/slash/.#frag')['status'], 200, 'dot frag'
5071017Szelenkov@nginx.com        )
5081017Szelenkov@nginx.com        self.assertEqual(
5091249Szelenkov@nginx.com            self.get(url='/slash/foo/..?args')['status'],
5101249Szelenkov@nginx.com            200,
5111308Szelenkov@nginx.com            'dot dot args',
5121017Szelenkov@nginx.com        )
5131017Szelenkov@nginx.com        self.assertEqual(
5141249Szelenkov@nginx.com            self.get(url='/slash/foo/..#frag')['status'],
5151249Szelenkov@nginx.com            200,
5161308Szelenkov@nginx.com            'dot dot frag',
5171017Szelenkov@nginx.com        )
5181017Szelenkov@nginx.com        self.assertEqual(
5191308Szelenkov@nginx.com            self.get(url='/slash/.')['status'], 200, 'trailing dot'
5201249Szelenkov@nginx.com        )
5211249Szelenkov@nginx.com        self.assertEqual(
5221249Szelenkov@nginx.com            self.get(url='/slash/foo/..')['status'],
5231249Szelenkov@nginx.com            200,
5241308Szelenkov@nginx.com            'trailing dot dot',
5251017Szelenkov@nginx.com        )
526972Szelenkov@nginx.com
527972Szelenkov@nginx.com    def test_routes_match_uri_case_sensitive(self):
5281308Szelenkov@nginx.com        self.route_match({"uri": "/BLAH"})
5291308Szelenkov@nginx.com
5301308Szelenkov@nginx.com        self.assertEqual(self.get(url='/blah')['status'], 404, '/blah')
5311308Szelenkov@nginx.com        self.assertEqual(self.get(url='/BlaH')['status'], 404, '/BlaH')
5321308Szelenkov@nginx.com        self.assertEqual(self.get(url='/BLAH')['status'], 200, '/BLAH')
5331308Szelenkov@nginx.com
5341308Szelenkov@nginx.com    def test_routes_match_uri_normalize(self):
5351308Szelenkov@nginx.com        self.route_match({"uri": "/blah"})
536972Szelenkov@nginx.com
5371017Szelenkov@nginx.com        self.assertEqual(
5381308Szelenkov@nginx.com            self.get(url='/%62%6c%61%68')['status'], 200, 'normalize'
5391017Szelenkov@nginx.com        )
540972Szelenkov@nginx.com
5411053Szelenkov@nginx.com    def test_routes_match_empty_array(self):
5421308Szelenkov@nginx.com        self.route_match({"uri": []})
5431053Szelenkov@nginx.com
5441308Szelenkov@nginx.com        self.assertEqual(self.get(url='/blah')['status'], 200, 'empty array')
5451053Szelenkov@nginx.com
5461053Szelenkov@nginx.com    def test_routes_reconfigure(self):
5471308Szelenkov@nginx.com        self.assertIn('success', self.conf([], 'routes'), 'redefine')
5481308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'redefine request')
5491053Szelenkov@nginx.com
5501053Szelenkov@nginx.com        self.assertIn(
5511053Szelenkov@nginx.com            'success',
5521434Szelenkov@nginx.com            self.conf([{"action": {"return": 200}}], 'routes'),
5531308Szelenkov@nginx.com            'redefine 2',
5541053Szelenkov@nginx.com        )
5551308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'redefine request 2')
5561053Szelenkov@nginx.com
5571308Szelenkov@nginx.com        self.assertIn('success', self.conf([], 'routes'), 'redefine 3')
5581308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'redefine request 3')
5591053Szelenkov@nginx.com
5601053Szelenkov@nginx.com        self.assertIn(
5611053Szelenkov@nginx.com            'success',
5621053Szelenkov@nginx.com            self.conf(
5631053Szelenkov@nginx.com                {
5641053Szelenkov@nginx.com                    "listeners": {"*:7080": {"pass": "routes/main"}},
5651434Szelenkov@nginx.com                    "routes": {"main": [{"action": {"return": 200}}]},
5661434Szelenkov@nginx.com                    "applications": {},
5671053Szelenkov@nginx.com                }
5681053Szelenkov@nginx.com            ),
5691308Szelenkov@nginx.com            'redefine 4',
5701053Szelenkov@nginx.com        )
5711308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'redefine request 4')
5721053Szelenkov@nginx.com
5731053Szelenkov@nginx.com        self.assertIn(
5741308Szelenkov@nginx.com            'success', self.conf_delete('routes/main/0'), 'redefine 5'
5751053Szelenkov@nginx.com        )
5761308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'redefine request 5')
5771053Szelenkov@nginx.com
5781053Szelenkov@nginx.com        self.assertIn(
5791053Szelenkov@nginx.com            'success',
5801434Szelenkov@nginx.com            self.conf_post({"action": {"return": 200}}, 'routes/main'),
5811308Szelenkov@nginx.com            'redefine 6',
5821053Szelenkov@nginx.com        )
5831308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'redefine request 6')
5841053Szelenkov@nginx.com
5851063Szelenkov@nginx.com        self.assertIn(
5861063Szelenkov@nginx.com            'error',
5871434Szelenkov@nginx.com            self.conf({"action": {"return": 200}}, 'routes/main/2'),
5881308Szelenkov@nginx.com            'redefine 7',
5891063Szelenkov@nginx.com        )
5901063Szelenkov@nginx.com        self.assertIn(
5911063Szelenkov@nginx.com            'success',
5921434Szelenkov@nginx.com            self.conf({"action": {"return": 201}}, 'routes/main/1'),
5931308Szelenkov@nginx.com            'redefine 8',
5941063Szelenkov@nginx.com        )
5951063Szelenkov@nginx.com
5961063Szelenkov@nginx.com        self.assertEqual(
5971308Szelenkov@nginx.com            len(self.conf_get('routes/main')), 2, 'redefine conf 8'
5981063Szelenkov@nginx.com        )
5991308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'redefine request 8')
6001063Szelenkov@nginx.com
6011053Szelenkov@nginx.com    def test_routes_edit(self):
6021308Szelenkov@nginx.com        self.route_match({"method": "GET"})
6031053Szelenkov@nginx.com
6041053Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'routes edit GET')
6051053Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 404, 'routes edit POST')
6061053Szelenkov@nginx.com
6071053Szelenkov@nginx.com        self.assertIn(
6081053Szelenkov@nginx.com            'success',
6091053Szelenkov@nginx.com            self.conf_post(
6101434Szelenkov@nginx.com                {"match": {"method": "POST"}, "action": {"return": 200}},
6111053Szelenkov@nginx.com                'routes',
6121053Szelenkov@nginx.com            ),
6131053Szelenkov@nginx.com            'routes edit configure 2',
6141053Szelenkov@nginx.com        )
6151053Szelenkov@nginx.com        self.assertEqual(
6161053Szelenkov@nginx.com            'GET',
6171053Szelenkov@nginx.com            self.conf_get('routes/0/match/method'),
6181053Szelenkov@nginx.com            'routes edit configure 2 check',
6191053Szelenkov@nginx.com        )
6201053Szelenkov@nginx.com        self.assertEqual(
6211053Szelenkov@nginx.com            'POST',
6221053Szelenkov@nginx.com            self.conf_get('routes/1/match/method'),
6231053Szelenkov@nginx.com            'routes edit configure 2 check 2',
6241053Szelenkov@nginx.com        )
6251053Szelenkov@nginx.com
6261053Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'routes edit GET 2')
6271053Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 200, 'routes edit POST 2')
6281053Szelenkov@nginx.com
6291053Szelenkov@nginx.com        self.assertIn(
6301434Szelenkov@nginx.com            'success', self.conf_delete('routes/0'), 'routes edit configure 3',
6311053Szelenkov@nginx.com        )
6321053Szelenkov@nginx.com
6331053Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'routes edit GET 3')
6341053Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 200, 'routes edit POST 3')
6351053Szelenkov@nginx.com
6361053Szelenkov@nginx.com        self.assertIn(
6371053Szelenkov@nginx.com            'error',
6381053Szelenkov@nginx.com            self.conf_delete('routes/1'),
6391053Szelenkov@nginx.com            'routes edit configure invalid',
6401053Szelenkov@nginx.com        )
6411053Szelenkov@nginx.com        self.assertIn(
6421053Szelenkov@nginx.com            'error',
6431053Szelenkov@nginx.com            self.conf_delete('routes/-1'),
6441053Szelenkov@nginx.com            'routes edit configure invalid 2',
6451053Szelenkov@nginx.com        )
6461053Szelenkov@nginx.com        self.assertIn(
6471053Szelenkov@nginx.com            'error',
6481053Szelenkov@nginx.com            self.conf_delete('routes/blah'),
6491053Szelenkov@nginx.com            'routes edit configure invalid 3',
6501053Szelenkov@nginx.com        )
6511053Szelenkov@nginx.com
6521053Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'routes edit GET 4')
6531053Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 200, 'routes edit POST 4')
6541053Szelenkov@nginx.com
6551053Szelenkov@nginx.com        self.assertIn(
6561434Szelenkov@nginx.com            'success', self.conf_delete('routes/0'), 'routes edit configure 5',
6571053Szelenkov@nginx.com        )
6581053Szelenkov@nginx.com
6591053Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'routes edit GET 5')
6601053Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 404, 'routes edit POST 5')
6611053Szelenkov@nginx.com
6621053Szelenkov@nginx.com        self.assertIn(
6631053Szelenkov@nginx.com            'success',
6641053Szelenkov@nginx.com            self.conf_post(
6651453Szelenkov@nginx.com                {"match": {"method": "POST"}, "action": {"return": 200}},
6661053Szelenkov@nginx.com                'routes',
6671053Szelenkov@nginx.com            ),
6681053Szelenkov@nginx.com            'routes edit configure 6',
6691053Szelenkov@nginx.com        )
6701053Szelenkov@nginx.com
6711053Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'routes edit GET 6')
6721053Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 200, 'routes edit POST 6')
6731053Szelenkov@nginx.com
6741053Szelenkov@nginx.com        self.assertIn(
6751053Szelenkov@nginx.com            'success',
6761053Szelenkov@nginx.com            self.conf(
6771053Szelenkov@nginx.com                {
6781053Szelenkov@nginx.com                    "listeners": {"*:7080": {"pass": "routes/main"}},
6791434Szelenkov@nginx.com                    "routes": {"main": [{"action": {"return": 200}}]},
6801434Szelenkov@nginx.com                    "applications": {},
6811053Szelenkov@nginx.com                }
6821053Szelenkov@nginx.com            ),
6831053Szelenkov@nginx.com            'route edit configure 7',
6841053Szelenkov@nginx.com        )
6851053Szelenkov@nginx.com
6861053Szelenkov@nginx.com        self.assertIn(
6871053Szelenkov@nginx.com            'error',
6881053Szelenkov@nginx.com            self.conf_delete('routes/0'),
6891053Szelenkov@nginx.com            'routes edit configure invalid 4',
6901053Szelenkov@nginx.com        )
6911053Szelenkov@nginx.com        self.assertIn(
6921053Szelenkov@nginx.com            'error',
6931053Szelenkov@nginx.com            self.conf_delete('routes/main'),
6941053Szelenkov@nginx.com            'routes edit configure invalid 5',
6951053Szelenkov@nginx.com        )
6961053Szelenkov@nginx.com
6971053Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'routes edit GET 7')
6981053Szelenkov@nginx.com
6991053Szelenkov@nginx.com        self.assertIn(
7001053Szelenkov@nginx.com            'success',
7011053Szelenkov@nginx.com            self.conf_delete('listeners/*:7080'),
7021053Szelenkov@nginx.com            'route edit configure 8',
7031053Szelenkov@nginx.com        )
7041053Szelenkov@nginx.com        self.assertIn(
7051053Szelenkov@nginx.com            'success',
7061053Szelenkov@nginx.com            self.conf_delete('routes/main'),
7071053Szelenkov@nginx.com            'route edit configure 9',
7081053Szelenkov@nginx.com        )
7091053Szelenkov@nginx.com
7101053Szelenkov@nginx.com    def test_match_edit(self):
7111053Szelenkov@nginx.com        self.skip_alerts.append(r'failed to apply new conf')
7121053Szelenkov@nginx.com
7131308Szelenkov@nginx.com        self.route_match({"method": ["GET", "POST"]})
7141053Szelenkov@nginx.com
7151053Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'match edit GET')
7161053Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 200, 'match edit POST')
7171053Szelenkov@nginx.com        self.assertEqual(self.put()['status'], 404, 'match edit PUT')
7181053Szelenkov@nginx.com
7191053Szelenkov@nginx.com        self.assertIn(
7201053Szelenkov@nginx.com            'success',
7211053Szelenkov@nginx.com            self.conf_post('\"PUT\"', 'routes/0/match/method'),
7221053Szelenkov@nginx.com            'match edit configure 2',
7231053Szelenkov@nginx.com        )
7241053Szelenkov@nginx.com        self.assertListEqual(
7251053Szelenkov@nginx.com            ['GET', 'POST', 'PUT'],
7261053Szelenkov@nginx.com            self.conf_get('routes/0/match/method'),
7271053Szelenkov@nginx.com            'match edit configure 2 check',
7281053Szelenkov@nginx.com        )
7291053Szelenkov@nginx.com
7301053Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'match edit GET 2')
7311053Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 200, 'match edit POST 2')
7321053Szelenkov@nginx.com        self.assertEqual(self.put()['status'], 200, 'match edit PUT 2')
7331053Szelenkov@nginx.com
7341053Szelenkov@nginx.com        self.assertIn(
7351053Szelenkov@nginx.com            'success',
7361053Szelenkov@nginx.com            self.conf_delete('routes/0/match/method/1'),
7371053Szelenkov@nginx.com            'match edit configure 3',
7381053Szelenkov@nginx.com        )
7391053Szelenkov@nginx.com        self.assertListEqual(
7401053Szelenkov@nginx.com            ['GET', 'PUT'],
7411053Szelenkov@nginx.com            self.conf_get('routes/0/match/method'),
7421053Szelenkov@nginx.com            'match edit configure 3 check',
7431053Szelenkov@nginx.com        )
7441053Szelenkov@nginx.com
7451053Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'match edit GET 3')
7461053Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 404, 'match edit POST 3')
7471053Szelenkov@nginx.com        self.assertEqual(self.put()['status'], 200, 'match edit PUT 3')
7481053Szelenkov@nginx.com
7491053Szelenkov@nginx.com        self.assertIn(
7501053Szelenkov@nginx.com            'success',
7511053Szelenkov@nginx.com            self.conf_delete('routes/0/match/method/1'),
7521053Szelenkov@nginx.com            'match edit configure 4',
7531053Szelenkov@nginx.com        )
7541053Szelenkov@nginx.com        self.assertListEqual(
7551053Szelenkov@nginx.com            ['GET'],
7561053Szelenkov@nginx.com            self.conf_get('routes/0/match/method'),
7571053Szelenkov@nginx.com            'match edit configure 4 check',
7581053Szelenkov@nginx.com        )
7591053Szelenkov@nginx.com
7601053Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'match edit GET 4')
7611053Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 404, 'match edit POST 4')
7621053Szelenkov@nginx.com        self.assertEqual(self.put()['status'], 404, 'match edit PUT 4')
7631053Szelenkov@nginx.com
7641053Szelenkov@nginx.com        self.assertIn(
7651053Szelenkov@nginx.com            'error',
7661053Szelenkov@nginx.com            self.conf_delete('routes/0/match/method/1'),
7671053Szelenkov@nginx.com            'match edit configure invalid',
7681053Szelenkov@nginx.com        )
7691053Szelenkov@nginx.com        self.assertIn(
7701053Szelenkov@nginx.com            'error',
7711053Szelenkov@nginx.com            self.conf_delete('routes/0/match/method/-1'),
7721053Szelenkov@nginx.com            'match edit configure invalid 2',
7731053Szelenkov@nginx.com        )
7741053Szelenkov@nginx.com        self.assertIn(
7751053Szelenkov@nginx.com            'error',
7761053Szelenkov@nginx.com            self.conf_delete('routes/0/match/method/blah'),
7771053Szelenkov@nginx.com            'match edit configure invalid 3',
7781053Szelenkov@nginx.com        )
7791053Szelenkov@nginx.com        self.assertListEqual(
7801053Szelenkov@nginx.com            ['GET'],
7811053Szelenkov@nginx.com            self.conf_get('routes/0/match/method'),
7821053Szelenkov@nginx.com            'match edit configure 5 check',
7831053Szelenkov@nginx.com        )
7841053Szelenkov@nginx.com
7851053Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'match edit GET 5')
7861053Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 404, 'match edit POST 5')
7871053Szelenkov@nginx.com        self.assertEqual(self.put()['status'], 404, 'match edit PUT 5')
7881053Szelenkov@nginx.com
7891053Szelenkov@nginx.com        self.assertIn(
7901053Szelenkov@nginx.com            'success',
7911053Szelenkov@nginx.com            self.conf_delete('routes/0/match/method/0'),
7921053Szelenkov@nginx.com            'match edit configure 6',
7931053Szelenkov@nginx.com        )
7941053Szelenkov@nginx.com        self.assertListEqual(
7951053Szelenkov@nginx.com            [],
7961053Szelenkov@nginx.com            self.conf_get('routes/0/match/method'),
7971053Szelenkov@nginx.com            'match edit configure 6 check',
7981053Szelenkov@nginx.com        )
7991053Szelenkov@nginx.com
8001053Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'match edit GET 6')
8011053Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 200, 'match edit POST 6')
8021053Szelenkov@nginx.com        self.assertEqual(self.put()['status'], 200, 'match edit PUT 6')
8031053Szelenkov@nginx.com
8041053Szelenkov@nginx.com        self.assertIn(
8051053Szelenkov@nginx.com            'success',
8061053Szelenkov@nginx.com            self.conf('"GET"', 'routes/0/match/method'),
8071053Szelenkov@nginx.com            'match edit configure 7',
8081053Szelenkov@nginx.com        )
8091053Szelenkov@nginx.com
8101053Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'match edit GET 7')
8111053Szelenkov@nginx.com        self.assertEqual(self.post()['status'], 404, 'match edit POST 7')
8121053Szelenkov@nginx.com        self.assertEqual(self.put()['status'], 404, 'match edit PUT 7')
8131053Szelenkov@nginx.com
8141053Szelenkov@nginx.com        self.assertIn(
8151053Szelenkov@nginx.com            'error',
8161053Szelenkov@nginx.com            self.conf_delete('routes/0/match/method/0'),
8171053Szelenkov@nginx.com            'match edit configure invalid 5',
8181053Szelenkov@nginx.com        )
8191053Szelenkov@nginx.com        self.assertIn(
8201053Szelenkov@nginx.com            'error',
8211053Szelenkov@nginx.com            self.conf({}, 'routes/0/action'),
8221053Szelenkov@nginx.com            'match edit configure invalid 6',
8231053Szelenkov@nginx.com        )
8241053Szelenkov@nginx.com
8251053Szelenkov@nginx.com        self.assertIn(
8261053Szelenkov@nginx.com            'success',
8271053Szelenkov@nginx.com            self.conf({}, 'routes/0/match'),
8281053Szelenkov@nginx.com            'match edit configure 8',
8291053Szelenkov@nginx.com        )
8301053Szelenkov@nginx.com
8311053Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'match edit GET 8')
8321053Szelenkov@nginx.com
833972Szelenkov@nginx.com    def test_routes_match_rules(self):
8341308Szelenkov@nginx.com        self.route_match({"method": "GET", "host": "localhost", "uri": "/"})
835972Szelenkov@nginx.com
836972Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'routes match rules')
837972Szelenkov@nginx.com
838972Szelenkov@nginx.com    def test_routes_loop(self):
8391017Szelenkov@nginx.com        self.assertIn(
8401017Szelenkov@nginx.com            'success',
8411101Szelenkov@nginx.com            self.route({"match": {"uri": "/"}, "action": {"pass": "routes"}}),
8421017Szelenkov@nginx.com            'routes loop configure',
8431017Szelenkov@nginx.com        )
844972Szelenkov@nginx.com
845972Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 500, 'routes loop')
846972Szelenkov@nginx.com
8471066Szelenkov@nginx.com    def test_routes_match_headers(self):
8481308Szelenkov@nginx.com        self.route_match({"headers": {"host": "localhost"}})
8491066Szelenkov@nginx.com
8501066Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'match headers')
8511308Szelenkov@nginx.com        self.host('Localhost', 200)
8521308Szelenkov@nginx.com        self.host('localhost.com', 404)
8531308Szelenkov@nginx.com        self.host('llocalhost', 404)
8541308Szelenkov@nginx.com        self.host('host', 404)
8551066Szelenkov@nginx.com
8561066Szelenkov@nginx.com    def test_routes_match_headers_multiple(self):
8571308Szelenkov@nginx.com        self.route_match({"headers": {"host": "localhost", "x-blah": "test"}})
8581066Szelenkov@nginx.com
8591066Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'match headers multiple')
8601066Szelenkov@nginx.com        self.assertEqual(
8611066Szelenkov@nginx.com            self.get(
8621066Szelenkov@nginx.com                headers={
8631066Szelenkov@nginx.com                    "Host": "localhost",
8641066Szelenkov@nginx.com                    "X-blah": "test",
8651066Szelenkov@nginx.com                    "Connection": "close",
8661066Szelenkov@nginx.com                }
8671066Szelenkov@nginx.com            )['status'],
8681066Szelenkov@nginx.com            200,
8691066Szelenkov@nginx.com            'match headers multiple 2',
8701066Szelenkov@nginx.com        )
8711066Szelenkov@nginx.com
8721066Szelenkov@nginx.com        self.assertEqual(
8731066Szelenkov@nginx.com            self.get(
8741066Szelenkov@nginx.com                headers={
8751066Szelenkov@nginx.com                    "Host": "localhost",
8761066Szelenkov@nginx.com                    "X-blah": "",
8771066Szelenkov@nginx.com                    "Connection": "close",
8781066Szelenkov@nginx.com                }
8791066Szelenkov@nginx.com            )['status'],
8801066Szelenkov@nginx.com            404,
8811066Szelenkov@nginx.com            'match headers multiple 3',
8821066Szelenkov@nginx.com        )
8831066Szelenkov@nginx.com
8841066Szelenkov@nginx.com    def test_routes_match_headers_multiple_values(self):
8851308Szelenkov@nginx.com        self.route_match({"headers": {"x-blah": "test"}})
8861066Szelenkov@nginx.com
8871066Szelenkov@nginx.com        self.assertEqual(
8881066Szelenkov@nginx.com            self.get(
8891066Szelenkov@nginx.com                headers={
8901066Szelenkov@nginx.com                    "Host": "localhost",
8911066Szelenkov@nginx.com                    "X-blah": ["test", "test", "test"],
8921066Szelenkov@nginx.com                    "Connection": "close",
8931066Szelenkov@nginx.com                }
8941066Szelenkov@nginx.com            )['status'],
8951066Szelenkov@nginx.com            200,
8961066Szelenkov@nginx.com            'match headers multiple values',
8971066Szelenkov@nginx.com        )
8981066Szelenkov@nginx.com        self.assertEqual(
8991066Szelenkov@nginx.com            self.get(
9001066Szelenkov@nginx.com                headers={
9011066Szelenkov@nginx.com                    "Host": "localhost",
9021066Szelenkov@nginx.com                    "X-blah": ["test", "blah", "test"],
9031066Szelenkov@nginx.com                    "Connection": "close",
9041066Szelenkov@nginx.com                }
9051066Szelenkov@nginx.com            )['status'],
9061066Szelenkov@nginx.com            404,
9071066Szelenkov@nginx.com            'match headers multiple values 2',
9081066Szelenkov@nginx.com        )
9091066Szelenkov@nginx.com        self.assertEqual(
9101066Szelenkov@nginx.com            self.get(
9111066Szelenkov@nginx.com                headers={
9121066Szelenkov@nginx.com                    "Host": "localhost",
9131066Szelenkov@nginx.com                    "X-blah": ["test", "", "test"],
9141066Szelenkov@nginx.com                    "Connection": "close",
9151066Szelenkov@nginx.com                }
9161066Szelenkov@nginx.com            )['status'],
9171066Szelenkov@nginx.com            404,
9181066Szelenkov@nginx.com            'match headers multiple values 3',
9191066Szelenkov@nginx.com        )
9201066Szelenkov@nginx.com
9211066Szelenkov@nginx.com    def test_routes_match_headers_multiple_rules(self):
9221308Szelenkov@nginx.com        self.route_match({"headers": {"x-blah": ["test", "blah"]}})
9231066Szelenkov@nginx.com
9241066Szelenkov@nginx.com        self.assertEqual(
9251066Szelenkov@nginx.com            self.get()['status'], 404, 'match headers multiple rules'
9261066Szelenkov@nginx.com        )
9271066Szelenkov@nginx.com        self.assertEqual(
9281066Szelenkov@nginx.com            self.get(
9291066Szelenkov@nginx.com                headers={
9301066Szelenkov@nginx.com                    "Host": "localhost",
9311066Szelenkov@nginx.com                    "X-blah": "test",
9321066Szelenkov@nginx.com                    "Connection": "close",
9331066Szelenkov@nginx.com                }
9341066Szelenkov@nginx.com            )['status'],
9351066Szelenkov@nginx.com            200,
9361066Szelenkov@nginx.com            'match headers multiple rules 2',
9371066Szelenkov@nginx.com        )
9381066Szelenkov@nginx.com        self.assertEqual(
9391066Szelenkov@nginx.com            self.get(
9401066Szelenkov@nginx.com                headers={
9411066Szelenkov@nginx.com                    "Host": "localhost",
9421066Szelenkov@nginx.com                    "X-blah": "blah",
9431066Szelenkov@nginx.com                    "Connection": "close",
9441066Szelenkov@nginx.com                }
9451066Szelenkov@nginx.com            )['status'],
9461066Szelenkov@nginx.com            200,
9471066Szelenkov@nginx.com            'match headers multiple rules 3',
9481066Szelenkov@nginx.com        )
9491066Szelenkov@nginx.com        self.assertEqual(
9501066Szelenkov@nginx.com            self.get(
9511066Szelenkov@nginx.com                headers={
9521066Szelenkov@nginx.com                    "Host": "localhost",
9531066Szelenkov@nginx.com                    "X-blah": ["test", "blah", "test"],
9541066Szelenkov@nginx.com                    "Connection": "close",
9551066Szelenkov@nginx.com                }
9561066Szelenkov@nginx.com            )['status'],
9571066Szelenkov@nginx.com            200,
9581066Szelenkov@nginx.com            'match headers multiple rules 4',
9591066Szelenkov@nginx.com        )
9601066Szelenkov@nginx.com
9611066Szelenkov@nginx.com        self.assertEqual(
9621066Szelenkov@nginx.com            self.get(
9631066Szelenkov@nginx.com                headers={
9641066Szelenkov@nginx.com                    "Host": "localhost",
9651066Szelenkov@nginx.com                    "X-blah": ["blah", ""],
9661066Szelenkov@nginx.com                    "Connection": "close",
9671066Szelenkov@nginx.com                }
9681066Szelenkov@nginx.com            )['status'],
9691066Szelenkov@nginx.com            404,
9701066Szelenkov@nginx.com            'match headers multiple rules 5',
9711066Szelenkov@nginx.com        )
9721066Szelenkov@nginx.com
9731066Szelenkov@nginx.com    def test_routes_match_headers_case_insensitive(self):
9741308Szelenkov@nginx.com        self.route_match({"headers": {"X-BLAH": "TEST"}})
9751066Szelenkov@nginx.com
9761066Szelenkov@nginx.com        self.assertEqual(
9771066Szelenkov@nginx.com            self.get(
9781066Szelenkov@nginx.com                headers={
9791066Szelenkov@nginx.com                    "Host": "localhost",
9801066Szelenkov@nginx.com                    "x-blah": "test",
9811066Szelenkov@nginx.com                    "Connection": "close",
9821066Szelenkov@nginx.com                }
9831066Szelenkov@nginx.com            )['status'],
9841066Szelenkov@nginx.com            200,
9851066Szelenkov@nginx.com            'match headers case insensitive',
9861066Szelenkov@nginx.com        )
9871066Szelenkov@nginx.com
9881066Szelenkov@nginx.com    def test_routes_match_headers_invalid(self):
9891308Szelenkov@nginx.com        self.route_match_invalid({"headers": ["blah"]})
9901308Szelenkov@nginx.com        self.route_match_invalid({"headers": {"foo": ["bar", {}]}})
9911308Szelenkov@nginx.com        self.route_match_invalid({"headers": {"": "blah"}})
9921066Szelenkov@nginx.com
9931066Szelenkov@nginx.com    def test_routes_match_headers_empty_rule(self):
9941308Szelenkov@nginx.com        self.route_match({"headers": {"host": ""}})
9951066Szelenkov@nginx.com
9961308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'localhost')
9971308Szelenkov@nginx.com        self.host('', 200)
9981066Szelenkov@nginx.com
9991066Szelenkov@nginx.com    def test_routes_match_headers_empty(self):
10001308Szelenkov@nginx.com        self.route_match({"headers": {}})
10011308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'empty')
10021066Szelenkov@nginx.com
10031308Szelenkov@nginx.com        self.route_match({"headers": []})
10041308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'empty 2')
10051066Szelenkov@nginx.com
10061066Szelenkov@nginx.com    def test_routes_match_headers_rule_array_empty(self):
10071308Szelenkov@nginx.com        self.route_match({"headers": {"blah": []}})
10081066Szelenkov@nginx.com
10091308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'array empty')
10101066Szelenkov@nginx.com        self.assertEqual(
10111066Szelenkov@nginx.com            self.get(
10121066Szelenkov@nginx.com                headers={
10131066Szelenkov@nginx.com                    "Host": "localhost",
10141066Szelenkov@nginx.com                    "blah": "foo",
10151066Szelenkov@nginx.com                    "Connection": "close",
10161066Szelenkov@nginx.com                }
10171066Szelenkov@nginx.com            )['status'], 200, 'match headers rule array empty 2'
10181066Szelenkov@nginx.com        )
10191066Szelenkov@nginx.com
10201066Szelenkov@nginx.com    def test_routes_match_headers_array(self):
10211308Szelenkov@nginx.com        self.route_match(
10221308Szelenkov@nginx.com            {
10231308Szelenkov@nginx.com                "headers": [
10241308Szelenkov@nginx.com                    {"x-header1": "foo*"},
10251308Szelenkov@nginx.com                    {"x-header2": "bar"},
10261308Szelenkov@nginx.com                    {"x-header3": ["foo", "bar"]},
10271308Szelenkov@nginx.com                    {"x-header1": "bar", "x-header4": "foo"},
10281308Szelenkov@nginx.com                ]
10291308Szelenkov@nginx.com            }
10301066Szelenkov@nginx.com        )
10311066Szelenkov@nginx.com
10321066Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'match headers array')
10331066Szelenkov@nginx.com        self.assertEqual(
10341066Szelenkov@nginx.com            self.get(
10351066Szelenkov@nginx.com                headers={
10361066Szelenkov@nginx.com                    "Host": "localhost",
10371066Szelenkov@nginx.com                    "x-header1": "foo123",
10381066Szelenkov@nginx.com                    "Connection": "close",
10391066Szelenkov@nginx.com                }
10401066Szelenkov@nginx.com            )['status'],
10411066Szelenkov@nginx.com            200,
10421066Szelenkov@nginx.com            'match headers array 2',
10431066Szelenkov@nginx.com        )
10441066Szelenkov@nginx.com        self.assertEqual(
10451066Szelenkov@nginx.com            self.get(
10461066Szelenkov@nginx.com                headers={
10471066Szelenkov@nginx.com                    "Host": "localhost",
10481066Szelenkov@nginx.com                    "x-header2": "bar",
10491066Szelenkov@nginx.com                    "Connection": "close",
10501066Szelenkov@nginx.com                }
10511066Szelenkov@nginx.com            )['status'],
10521066Szelenkov@nginx.com            200,
10531066Szelenkov@nginx.com            'match headers array 3',
10541066Szelenkov@nginx.com        )
10551066Szelenkov@nginx.com        self.assertEqual(
10561066Szelenkov@nginx.com            self.get(
10571066Szelenkov@nginx.com                headers={
10581066Szelenkov@nginx.com                    "Host": "localhost",
10591066Szelenkov@nginx.com                    "x-header3": "bar",
10601066Szelenkov@nginx.com                    "Connection": "close",
10611066Szelenkov@nginx.com                }
10621066Szelenkov@nginx.com            )['status'],
10631066Szelenkov@nginx.com            200,
10641066Szelenkov@nginx.com            'match headers array 4',
10651066Szelenkov@nginx.com        )
10661066Szelenkov@nginx.com        self.assertEqual(
10671066Szelenkov@nginx.com            self.get(
10681066Szelenkov@nginx.com                headers={
10691066Szelenkov@nginx.com                    "Host": "localhost",
10701066Szelenkov@nginx.com                    "x-header1": "bar",
10711066Szelenkov@nginx.com                    "Connection": "close",
10721066Szelenkov@nginx.com                }
10731066Szelenkov@nginx.com            )['status'],
10741066Szelenkov@nginx.com            404,
10751066Szelenkov@nginx.com            'match headers array 5',
10761066Szelenkov@nginx.com        )
10771066Szelenkov@nginx.com        self.assertEqual(
10781066Szelenkov@nginx.com            self.get(
10791066Szelenkov@nginx.com                headers={
10801066Szelenkov@nginx.com                    "Host": "localhost",
10811066Szelenkov@nginx.com                    "x-header1": "bar",
10821066Szelenkov@nginx.com                    "x-header4": "foo",
10831066Szelenkov@nginx.com                    "Connection": "close",
10841066Szelenkov@nginx.com                }
10851066Szelenkov@nginx.com            )['status'],
10861066Szelenkov@nginx.com            200,
10871066Szelenkov@nginx.com            'match headers array 6',
10881066Szelenkov@nginx.com        )
10891066Szelenkov@nginx.com
10901066Szelenkov@nginx.com        self.assertIn(
10911066Szelenkov@nginx.com            'success',
10921066Szelenkov@nginx.com            self.conf_delete('routes/0/match/headers/1'),
10931066Szelenkov@nginx.com            'match headers array configure 2',
10941066Szelenkov@nginx.com        )
10951066Szelenkov@nginx.com
10961066Szelenkov@nginx.com        self.assertEqual(
10971066Szelenkov@nginx.com            self.get(
10981066Szelenkov@nginx.com                headers={
10991066Szelenkov@nginx.com                    "Host": "localhost",
11001066Szelenkov@nginx.com                    "x-header2": "bar",
11011066Szelenkov@nginx.com                    "Connection": "close",
11021066Szelenkov@nginx.com                }
11031066Szelenkov@nginx.com            )['status'],
11041066Szelenkov@nginx.com            404,
11051066Szelenkov@nginx.com            'match headers array 7',
11061066Szelenkov@nginx.com        )
11071066Szelenkov@nginx.com        self.assertEqual(
11081066Szelenkov@nginx.com            self.get(
11091066Szelenkov@nginx.com                headers={
11101066Szelenkov@nginx.com                    "Host": "localhost",
11111066Szelenkov@nginx.com                    "x-header3": "foo",
11121066Szelenkov@nginx.com                    "Connection": "close",
11131066Szelenkov@nginx.com                }
11141066Szelenkov@nginx.com            )['status'],
11151066Szelenkov@nginx.com            200,
11161066Szelenkov@nginx.com            'match headers array 8',
11171066Szelenkov@nginx.com        )
11181017Szelenkov@nginx.com
11191067Szelenkov@nginx.com    def test_routes_match_arguments(self):
11201308Szelenkov@nginx.com        self.route_match({"arguments": {"foo": "bar"}})
11211067Szelenkov@nginx.com
11221308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'args')
11231308Szelenkov@nginx.com        self.assertEqual(self.get(url='/?foo=bar')['status'], 200, 'args 2')
11241308Szelenkov@nginx.com        self.assertEqual(self.get(url='/?foo=bar1')['status'], 404, 'args 3')
11251308Szelenkov@nginx.com        self.assertEqual(self.get(url='/?1foo=bar')['status'], 404, 'args 4')
11261308Szelenkov@nginx.com        self.assertEqual(self.get(url='/?Foo=bar')['status'], 404, 'case')
11271308Szelenkov@nginx.com        self.assertEqual(self.get(url='/?foo=Bar')['status'], 404, 'case 2')
11281067Szelenkov@nginx.com
11291475Saxel.duch@nginx.com    def test_routes_match_arguments_chars(self):
11301475Saxel.duch@nginx.com        chars = (
11311475Saxel.duch@nginx.com            " !\"%23$%25%26'()*%2B,-./0123456789:;<%3D>?@"
11321475Saxel.duch@nginx.com            "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
11331475Saxel.duch@nginx.com        )
11341475Saxel.duch@nginx.com
11351475Saxel.duch@nginx.com        chars_enc = ""
11361475Saxel.duch@nginx.com        for h1 in ["2", "3", "4", "5", "6", "7"]:
11371475Saxel.duch@nginx.com            for h2 in ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
11381475Saxel.duch@nginx.com                       "B", "C", "D", "E", "F",
11391475Saxel.duch@nginx.com            ]:
11401475Saxel.duch@nginx.com                chars_enc += "%" + h1 + h2
11411475Saxel.duch@nginx.com        chars_enc = chars_enc[:-3]
11421475Saxel.duch@nginx.com
11431475Saxel.duch@nginx.com        def check_args(args, query):
11441475Saxel.duch@nginx.com            self.route_match({"arguments": args})
11451475Saxel.duch@nginx.com            self.assertEqual(self.get(url='/?' + query)['status'], 200)
11461475Saxel.duch@nginx.com
11471475Saxel.duch@nginx.com        check_args({chars: chars}, chars + '=' + chars)
11481475Saxel.duch@nginx.com        check_args({chars: chars}, chars + '=' + chars_enc)
11491475Saxel.duch@nginx.com        check_args({chars: chars}, chars_enc + '=' + chars)
11501475Saxel.duch@nginx.com        check_args({chars: chars}, chars_enc + '=' + chars_enc)
11511475Saxel.duch@nginx.com        check_args({chars_enc: chars_enc}, chars + '=' + chars)
11521475Saxel.duch@nginx.com        check_args({chars_enc: chars_enc}, chars + '=' + chars_enc)
11531475Saxel.duch@nginx.com        check_args({chars_enc: chars_enc}, chars_enc + '=' + chars)
11541475Saxel.duch@nginx.com        check_args({chars_enc: chars_enc}, chars_enc + '=' + chars_enc)
11551475Saxel.duch@nginx.com
11561067Szelenkov@nginx.com    def test_routes_match_arguments_empty(self):
11571308Szelenkov@nginx.com        self.route_match({"arguments": {}})
11581308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'arguments empty')
11591067Szelenkov@nginx.com
11601308Szelenkov@nginx.com        self.route_match({"arguments": []})
11611308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'arguments empty 2')
11621067Szelenkov@nginx.com
11631067Szelenkov@nginx.com    def test_routes_match_arguments_space(self):
11641475Saxel.duch@nginx.com        self.route_match({"arguments": {"+fo o%20": "%20b+a r"}})
11651475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/? fo o = b a r&')['status'], 200)
11661475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?+fo+o+=+b+a+r&')['status'], 200)
11671067Szelenkov@nginx.com        self.assertEqual(
11681475Saxel.duch@nginx.com            self.get(url='/?%20fo%20o%20=%20b%20a%20r&')['status'], 200
11691067Szelenkov@nginx.com        )
11701067Szelenkov@nginx.com
11711475Saxel.duch@nginx.com        self.route_match({"arguments": {"%20foo": " bar"}})
11721475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/? foo= bar')['status'], 200)
11731475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?+foo=+bar')['status'], 200)
11741475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%20foo=%20bar')['status'], 200)
11751475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?+foo= bar')['status'], 200)
11761475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%20foo=+bar')['status'], 200)
11771475Saxel.duch@nginx.com
11781475Saxel.duch@nginx.com    def test_routes_match_arguments_equal(self):
11791475Saxel.duch@nginx.com        self.route_match({"arguments": {"=": "="}})
11801475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%3D=%3D')['status'], 200)
11811475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%3D==')['status'], 200)
11821475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?===')['status'], 404)
11831475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%3D%3D%3D')['status'], 404)
11841475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?==%3D')['status'], 404)
11851475Saxel.duch@nginx.com
11861475Saxel.duch@nginx.com    def test_routes_match_arguments_enc(self):
11871475Saxel.duch@nginx.com        self.route_match({"arguments": {"Ю": "н"}})
11881475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%D0%AE=%D0%BD')['status'], 200)
11891475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%d0%ae=%d0%Bd')['status'], 200)
11901475Saxel.duch@nginx.com
11911475Saxel.duch@nginx.com    def test_routes_match_arguments_hash(self):
11921475Saxel.duch@nginx.com        self.route_match({"arguments": {"#": "#"}})
11931475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%23=%23')['status'], 200)
11941475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%23=%23#')['status'], 200)
11951475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?#=#')['status'], 404)
11961475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%23=#')['status'], 404)
11971475Saxel.duch@nginx.com
11981475Saxel.duch@nginx.com    def test_routes_match_arguments_wildcard(self):
11991475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "*"}})
12001475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo')['status'], 200)
12011475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=')['status'], 200)
12021475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=blah')['status'], 200)
12031475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?blah=foo')['status'], 404)
12041475Saxel.duch@nginx.com
12051475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "%25*"}})
12061475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=%xx')['status'], 200)
12071475Saxel.duch@nginx.com
12081475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "%2A*"}})
12091475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=*xx')['status'], 200)
12101475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=xx')['status'], 404)
12111475Saxel.duch@nginx.com
12121475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "*%2A"}})
12131475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=xx*')['status'], 200)
12141475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=xx*x')['status'], 404)
12151067Szelenkov@nginx.com
12161475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "1*2"}})
12171475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=12')['status'], 200)
12181475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=1blah2')['status'], 200)
12191475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=1%2A2')['status'], 200)
12201475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=x12')['status'], 404)
12211475Saxel.duch@nginx.com
12221475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "bar*", "%25": "%25"}})
12231475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=barxx&%=%')['status'], 200)
12241475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=barxx&x%=%')['status'], 404)
12251475Saxel.duch@nginx.com
12261475Saxel.duch@nginx.com    def test_routes_match_arguments_negative(self):
12271475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "!%25"}})
12281475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=blah')['status'], 200)
12291475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=%')['status'], 404)
12301475Saxel.duch@nginx.com
12311475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "%21blah"}})
12321475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=%21blah')['status'], 200)
12331475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=!blah')['status'], 200)
12341475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=bar')['status'], 404)
12351475Saxel.duch@nginx.com
12361475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "!!%21*a"}})
12371475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=blah')['status'], 200)
12381475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=!blah')['status'], 200)
12391475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=!!a')['status'], 404)
12401475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=!!bla')['status'], 404)
12411067Szelenkov@nginx.com
12421475Saxel.duch@nginx.com    def test_routes_match_arguments_percent(self):
12431475Saxel.duch@nginx.com        self.route_match({"arguments": {"%25": "%25"}})
12441475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%=%')['status'], 200)
12451475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%25=%25')['status'], 200)
12461475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%25=%')['status'], 200)
12471475Saxel.duch@nginx.com
12481475Saxel.duch@nginx.com        self.route_match({"arguments": {"%251": "%252"}})
12491475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%1=%2')['status'], 200)
12501475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%251=%252')['status'], 200)
12511475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%251=%2')['status'], 200)
12521067Szelenkov@nginx.com
12531475Saxel.duch@nginx.com        self.route_match({"arguments": {"%25%21%251": "%25%24%252"}})
12541475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%!%1=%$%2')['status'], 200)
12551475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%25!%251=%25$%252')['status'], 200)
12561475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%25!%1=%$%2')['status'], 200)
12571475Saxel.duch@nginx.com
12581475Saxel.duch@nginx.com    def test_routes_match_arguments_ampersand(self):
12591475Saxel.duch@nginx.com        self.route_match({"arguments": {"foo": "&"}})
12601475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=%26')['status'], 200)
12611475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=%26&')['status'], 200)
12621475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=%26%26')['status'], 404)
12631475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?foo=&')['status'], 404)
12641475Saxel.duch@nginx.com
12651475Saxel.duch@nginx.com        self.route_match({"arguments": {"&": ""}})
12661475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%26=')['status'], 200)
12671475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%26=&')['status'], 200)
12681475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?%26=%26')['status'], 404)
12691475Saxel.duch@nginx.com        self.assertEqual(self.get(url='/?&=')['status'], 404)
12701067Szelenkov@nginx.com
12711067Szelenkov@nginx.com    def test_routes_match_arguments_complex(self):
12721308Szelenkov@nginx.com        self.route_match({"arguments": {"foo": ""}})
12731067Szelenkov@nginx.com
12741308Szelenkov@nginx.com        self.assertEqual(self.get(url='/?foo')['status'], 200, 'complex')
12751067Szelenkov@nginx.com        self.assertEqual(
12761308Szelenkov@nginx.com            self.get(url='/?blah=blah&foo=')['status'], 200, 'complex 2'
12771067Szelenkov@nginx.com        )
12781067Szelenkov@nginx.com        self.assertEqual(
12791308Szelenkov@nginx.com            self.get(url='/?&&&foo&&&')['status'], 200, 'complex 3'
12801067Szelenkov@nginx.com        )
12811067Szelenkov@nginx.com        self.assertEqual(
12821308Szelenkov@nginx.com            self.get(url='/?foo&foo=bar&foo')['status'], 404, 'complex 4'
12831067Szelenkov@nginx.com        )
12841067Szelenkov@nginx.com        self.assertEqual(
12851308Szelenkov@nginx.com            self.get(url='/?foo=&foo')['status'], 200, 'complex 5'
12861067Szelenkov@nginx.com        )
12871067Szelenkov@nginx.com        self.assertEqual(
12881308Szelenkov@nginx.com            self.get(url='/?&=&foo&==&')['status'], 200, 'complex 6'
12891067Szelenkov@nginx.com        )
12901067Szelenkov@nginx.com        self.assertEqual(
12911308Szelenkov@nginx.com            self.get(url='/?&=&bar&==&')['status'], 404, 'complex 7'
12921067Szelenkov@nginx.com        )
12931067Szelenkov@nginx.com
12941067Szelenkov@nginx.com    def test_routes_match_arguments_multiple(self):
12951308Szelenkov@nginx.com        self.route_match({"arguments": {"foo": "bar", "blah": "test"}})
12961067Szelenkov@nginx.com
12971308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'multiple')
12981067Szelenkov@nginx.com        self.assertEqual(
12991308Szelenkov@nginx.com            self.get(url='/?foo=bar&blah=test')['status'], 200, 'multiple 2'
13001067Szelenkov@nginx.com        )
13011067Szelenkov@nginx.com        self.assertEqual(
13021308Szelenkov@nginx.com            self.get(url='/?foo=bar&blah')['status'], 404, 'multiple 3'
13031067Szelenkov@nginx.com        )
13041475Saxel.duch@nginx.com        self.assertEqual(
13051475Saxel.duch@nginx.com            self.get(url='/?foo=bar&blah=tes')['status'], 404, 'multiple 4'
13061475Saxel.duch@nginx.com        )
13071475Saxel.duch@nginx.com        self.assertEqual(
13081475Saxel.duch@nginx.com            self.get(url='/?foo=b%61r&bl%61h=t%65st')['status'],
13091475Saxel.duch@nginx.com            200,
13101475Saxel.duch@nginx.com            'multiple 5',
13111475Saxel.duch@nginx.com        )
13121067Szelenkov@nginx.com
13131067Szelenkov@nginx.com    def test_routes_match_arguments_multiple_rules(self):
13141308Szelenkov@nginx.com        self.route_match({"arguments": {"foo": ["bar", "blah"]}})
13151067Szelenkov@nginx.com
13161308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'rules')
13171308Szelenkov@nginx.com        self.assertEqual(self.get(url='/?foo=bar')['status'], 200, 'rules 2')
13181308Szelenkov@nginx.com        self.assertEqual(self.get(url='/?foo=blah')['status'], 200, 'rules 3')
13191067Szelenkov@nginx.com        self.assertEqual(
13201067Szelenkov@nginx.com            self.get(url='/?foo=blah&foo=bar&foo=blah')['status'],
13211067Szelenkov@nginx.com            200,
13221308Szelenkov@nginx.com            'rules 4',
13231067Szelenkov@nginx.com        )
13241067Szelenkov@nginx.com        self.assertEqual(
13251308Szelenkov@nginx.com            self.get(url='/?foo=blah&foo=bar&foo=')['status'], 404, 'rules 5'
13261067Szelenkov@nginx.com        )
13271067Szelenkov@nginx.com
13281067Szelenkov@nginx.com    def test_routes_match_arguments_array(self):
13291308Szelenkov@nginx.com        self.route_match(
13301308Szelenkov@nginx.com            {
13311308Szelenkov@nginx.com                "arguments": [
13321308Szelenkov@nginx.com                    {"var1": "val1*"},
13331308Szelenkov@nginx.com                    {"var2": "val2"},
13341308Szelenkov@nginx.com                    {"var3": ["foo", "bar"]},
13351308Szelenkov@nginx.com                    {"var1": "bar", "var4": "foo"},
13361308Szelenkov@nginx.com                ]
13371308Szelenkov@nginx.com            }
13381067Szelenkov@nginx.com        )
13391067Szelenkov@nginx.com
13401308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'arr')
13411308Szelenkov@nginx.com        self.assertEqual(self.get(url='/?var1=val123')['status'], 200, 'arr 2')
13421308Szelenkov@nginx.com        self.assertEqual(self.get(url='/?var2=val2')['status'], 200, 'arr 3')
13431308Szelenkov@nginx.com        self.assertEqual(self.get(url='/?var3=bar')['status'], 200, 'arr 4')
13441308Szelenkov@nginx.com        self.assertEqual(self.get(url='/?var1=bar')['status'], 404, 'arr 5')
13451067Szelenkov@nginx.com        self.assertEqual(
13461308Szelenkov@nginx.com            self.get(url='/?var1=bar&var4=foo')['status'], 200, 'arr 6'
13471067Szelenkov@nginx.com        )
13481067Szelenkov@nginx.com
13491067Szelenkov@nginx.com        self.assertIn(
13501067Szelenkov@nginx.com            'success',
13511067Szelenkov@nginx.com            self.conf_delete('routes/0/match/arguments/1'),
13521067Szelenkov@nginx.com            'match arguments array configure 2',
13531067Szelenkov@nginx.com        )
13541067Szelenkov@nginx.com
13551308Szelenkov@nginx.com        self.assertEqual(self.get(url='/?var2=val2')['status'], 404, 'arr 7')
13561308Szelenkov@nginx.com        self.assertEqual(self.get(url='/?var3=foo')['status'], 200, 'arr 8')
13571067Szelenkov@nginx.com
13581475Saxel.duch@nginx.com    def test_routes_match_arguments_invalid(self):
13591475Saxel.duch@nginx.com        # TODO remove it after controller fixed
13601475Saxel.duch@nginx.com        self.skip_alerts.append(r'failed to apply new conf')
13611475Saxel.duch@nginx.com
13621475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": ["var"]})
13631475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": [{"var1": {}}]})
13641475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"": "bar"}})
13651475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"foo": "*ba*r"}})
13661475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"foo": "%"}})
13671475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"foo": "%1G"}})
13681475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"%": "bar"}})
13691475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"foo": "%0"}})
13701475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"foo": "%%1F"}})
13711475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"%%1F": ""}})
13721475Saxel.duch@nginx.com        self.route_match_invalid({"arguments": {"%7%F": ""}})
13731475Saxel.duch@nginx.com
13741068Szelenkov@nginx.com    def test_routes_match_cookies(self):
13751308Szelenkov@nginx.com        self.route_match({"cookies": {"foO": "bar"}})
13761068Szelenkov@nginx.com
13771308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'cookie')
13781308Szelenkov@nginx.com        self.cookie('foO=bar', 200)
13791308Szelenkov@nginx.com        self.cookie('foO=bar;1', 200)
13801308Szelenkov@nginx.com        self.cookie(['foO=bar', 'blah=blah'], 200)
13811308Szelenkov@nginx.com        self.cookie('foO=bar; blah=blah', 200)
13821308Szelenkov@nginx.com        self.cookie('Foo=bar', 404)
13831308Szelenkov@nginx.com        self.cookie('foO=Bar', 404)
13841308Szelenkov@nginx.com        self.cookie('foO=bar1', 404)
13851308Szelenkov@nginx.com        self.cookie('1foO=bar;', 404)
13861068Szelenkov@nginx.com
13871068Szelenkov@nginx.com    def test_routes_match_cookies_empty(self):
13881308Szelenkov@nginx.com        self.route_match({"cookies": {}})
13891308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'cookies empty')
13901068Szelenkov@nginx.com
13911308Szelenkov@nginx.com        self.route_match({"cookies": []})
13921308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'cookies empty 2')
13931068Szelenkov@nginx.com
13941068Szelenkov@nginx.com    def test_routes_match_cookies_invalid(self):
13951308Szelenkov@nginx.com        self.route_match_invalid({"cookies": ["var"]})
13961308Szelenkov@nginx.com        self.route_match_invalid({"cookies": [{"foo": {}}]})
13971068Szelenkov@nginx.com
13981068Szelenkov@nginx.com    def test_routes_match_cookies_multiple(self):
13991308Szelenkov@nginx.com        self.route_match({"cookies": {"foo": "bar", "blah": "blah"}})
14001308Szelenkov@nginx.com
14011308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'multiple')
14021308Szelenkov@nginx.com        self.cookie('foo=bar; blah=blah', 200)
14031308Szelenkov@nginx.com        self.cookie(['foo=bar', 'blah=blah'], 200)
14041308Szelenkov@nginx.com        self.cookie(['foo=bar; blah', 'blah'], 404)
14051308Szelenkov@nginx.com        self.cookie(['foo=bar; blah=test', 'blah=blah'], 404)
14061068Szelenkov@nginx.com
14071308Szelenkov@nginx.com    def test_routes_match_cookies_multiple_values(self):
14081308Szelenkov@nginx.com        self.route_match({"cookies": {"blah": "blah"}})
14091308Szelenkov@nginx.com
14101308Szelenkov@nginx.com        self.cookie(['blah=blah', 'blah=blah', 'blah=blah'], 200)
14111308Szelenkov@nginx.com        self.cookie(['blah=blah', 'blah=test', 'blah=blah'], 404)
14121308Szelenkov@nginx.com        self.cookie(['blah=blah; blah=', 'blah=blah'], 404)
14131308Szelenkov@nginx.com
14141308Szelenkov@nginx.com    def test_routes_match_cookies_multiple_rules(self):
14151308Szelenkov@nginx.com        self.route_match({"cookies": {"blah": ["test", "blah"]}})
14161068Szelenkov@nginx.com
14171308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'multiple rules')
14181308Szelenkov@nginx.com        self.cookie('blah=test', 200)
14191308Szelenkov@nginx.com        self.cookie('blah=blah', 200)
14201308Szelenkov@nginx.com        self.cookie(['blah=blah', 'blah=test', 'blah=blah'], 200)
14211308Szelenkov@nginx.com        self.cookie(['blah=blah; blah=test', 'blah=blah'], 200)
14221308Szelenkov@nginx.com        self.cookie(['blah=blah', 'blah'], 200) # invalid cookie
14231068Szelenkov@nginx.com
14241308Szelenkov@nginx.com    def test_routes_match_cookies_array(self):
14251308Szelenkov@nginx.com        self.route_match(
14261308Szelenkov@nginx.com            {
14271308Szelenkov@nginx.com                "cookies": [
14281308Szelenkov@nginx.com                    {"var1": "val1*"},
14291308Szelenkov@nginx.com                    {"var2": "val2"},
14301308Szelenkov@nginx.com                    {"var3": ["foo", "bar"]},
14311308Szelenkov@nginx.com                    {"var1": "bar", "var4": "foo"},
14321308Szelenkov@nginx.com                ]
14331308Szelenkov@nginx.com            }
14341068Szelenkov@nginx.com        )
14351068Szelenkov@nginx.com
14361308Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'cookies array')
14371308Szelenkov@nginx.com        self.cookie('var1=val123', 200)
14381308Szelenkov@nginx.com        self.cookie('var2=val2', 200)
14391308Szelenkov@nginx.com        self.cookie(' var2=val2 ', 200)
14401308Szelenkov@nginx.com        self.cookie('var3=bar', 200)
14411308Szelenkov@nginx.com        self.cookie('var3=bar;', 200)
14421308Szelenkov@nginx.com        self.cookie('var1=bar', 404)
14431308Szelenkov@nginx.com        self.cookie('var1=bar; var4=foo;', 200)
14441308Szelenkov@nginx.com        self.cookie(['var1=bar', 'var4=foo'], 200)
14451068Szelenkov@nginx.com
14461068Szelenkov@nginx.com        self.assertIn(
14471068Szelenkov@nginx.com            'success',
14481068Szelenkov@nginx.com            self.conf_delete('routes/0/match/cookies/1'),
14491068Szelenkov@nginx.com            'match cookies array configure 2',
14501068Szelenkov@nginx.com        )
14511068Szelenkov@nginx.com
14521308Szelenkov@nginx.com        self.cookie('var2=val2', 404)
14531308Szelenkov@nginx.com        self.cookie('var3=foo', 200)
14541068Szelenkov@nginx.com
14551110Saxel.duch@nginx.com    def test_routes_match_scheme(self):
14561308Szelenkov@nginx.com        self.route_match({"scheme": "http"})
14571308Szelenkov@nginx.com        self.route_match({"scheme": "https"})
14581308Szelenkov@nginx.com        self.route_match({"scheme": "HtTp"})
14591308Szelenkov@nginx.com        self.route_match({"scheme": "HtTpS"})
14601110Saxel.duch@nginx.com
14611110Saxel.duch@nginx.com    def test_routes_match_scheme_invalid(self):
14621308Szelenkov@nginx.com        self.route_match_invalid({"scheme": ["http"]})
14631308Szelenkov@nginx.com        self.route_match_invalid({"scheme": "ftp"})
14641308Szelenkov@nginx.com        self.route_match_invalid({"scheme": "ws"})
14651308Szelenkov@nginx.com        self.route_match_invalid({"scheme": "*"})
14661308Szelenkov@nginx.com        self.route_match_invalid({"scheme": ""})
14671308Szelenkov@nginx.com
14681325Saxel.duch@nginx.com    def test_routes_source_port(self):
14691325Saxel.duch@nginx.com        def sock_port():
14701325Saxel.duch@nginx.com            _, sock = self.http(b'', start=True, raw=True, no_recv=True)
14711325Saxel.duch@nginx.com            port = sock.getsockname()[1]
14721325Saxel.duch@nginx.com            return (sock, port)
14731325Saxel.duch@nginx.com
14741325Saxel.duch@nginx.com        sock, port = sock_port()
14751325Saxel.duch@nginx.com        sock2, port2 = sock_port()
14761325Saxel.duch@nginx.com
14771325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.1:" + str(port)})
14781325Saxel.duch@nginx.com        self.assertEqual(self.get(sock=sock)['status'], 200, 'exact')
14791325Saxel.duch@nginx.com        self.assertEqual(self.get(sock=sock2)['status'], 404, 'exact 2')
14801325Saxel.duch@nginx.com
14811325Saxel.duch@nginx.com        sock, port = sock_port()
14821325Saxel.duch@nginx.com        sock2, port2 = sock_port()
14831325Saxel.duch@nginx.com
14841325Saxel.duch@nginx.com        self.route_match({"source": "!127.0.0.1:" + str(port)})
14851325Saxel.duch@nginx.com        self.assertEqual(self.get(sock=sock)['status'], 404, 'negative')
14861325Saxel.duch@nginx.com        self.assertEqual(self.get(sock=sock2)['status'], 200, 'negative 2')
14871325Saxel.duch@nginx.com
14881325Saxel.duch@nginx.com        sock, port = sock_port()
14891325Saxel.duch@nginx.com        sock2, port2 = sock_port()
14901325Saxel.duch@nginx.com
14911391Szelenkov@nginx.com        self.route_match({"source": ["*:" + str(port), "!127.0.0.1"]})
14921391Szelenkov@nginx.com        self.assertEqual(self.get(sock=sock)['status'], 404, 'negative 3')
14931391Szelenkov@nginx.com        self.assertEqual(self.get(sock=sock2)['status'], 404, 'negative 4')
14941391Szelenkov@nginx.com
14951391Szelenkov@nginx.com        sock, port = sock_port()
14961391Szelenkov@nginx.com        sock2, port2 = sock_port()
14971391Szelenkov@nginx.com
14981325Saxel.duch@nginx.com        self.route_match(
14991325Saxel.duch@nginx.com            {"source": "127.0.0.1:" + str(port) + "-" + str(port)}
15001325Saxel.duch@nginx.com        )
15011325Saxel.duch@nginx.com        self.assertEqual(self.get(sock=sock)['status'], 200, 'range single')
15021325Saxel.duch@nginx.com        self.assertEqual(self.get(sock=sock2)['status'], 404, 'range single 2')
15031325Saxel.duch@nginx.com
15041325Saxel.duch@nginx.com        socks = [
15051325Saxel.duch@nginx.com            sock_port(),
15061325Saxel.duch@nginx.com            sock_port(),
15071325Saxel.duch@nginx.com            sock_port(),
15081325Saxel.duch@nginx.com            sock_port(),
15091325Saxel.duch@nginx.com            sock_port(),
15101325Saxel.duch@nginx.com        ]
15111325Saxel.duch@nginx.com        socks.sort(key=lambda sock: sock[1])
15121325Saxel.duch@nginx.com
15131325Saxel.duch@nginx.com        self.route_match(
15141325Saxel.duch@nginx.com            {
15151325Saxel.duch@nginx.com                "source": "127.0.0.1:"
15161325Saxel.duch@nginx.com                + str(socks[1][1])  # second port number
15171325Saxel.duch@nginx.com                + "-"
15181325Saxel.duch@nginx.com                + str(socks[3][1])  # fourth port number
15191325Saxel.duch@nginx.com            }
15201325Saxel.duch@nginx.com        )
15211325Saxel.duch@nginx.com        self.assertEqual(self.get(sock=socks[0][0])['status'], 404, 'range')
15221325Saxel.duch@nginx.com        self.assertEqual(self.get(sock=socks[1][0])['status'], 200, 'range 2')
15231325Saxel.duch@nginx.com        self.assertEqual(self.get(sock=socks[2][0])['status'], 200, 'range 3')
15241325Saxel.duch@nginx.com        self.assertEqual(self.get(sock=socks[3][0])['status'], 200, 'range 4')
15251325Saxel.duch@nginx.com        self.assertEqual(self.get(sock=socks[4][0])['status'], 404, 'range 5')
15261325Saxel.duch@nginx.com
15271325Saxel.duch@nginx.com        socks = [
15281325Saxel.duch@nginx.com            sock_port(),
15291325Saxel.duch@nginx.com            sock_port(),
15301325Saxel.duch@nginx.com            sock_port(),
15311325Saxel.duch@nginx.com        ]
15321325Saxel.duch@nginx.com        socks.sort(key=lambda sock: sock[1])
15331325Saxel.duch@nginx.com
15341325Saxel.duch@nginx.com        self.route_match(
15351325Saxel.duch@nginx.com            {
15361325Saxel.duch@nginx.com                "source": [
15371325Saxel.duch@nginx.com                    "127.0.0.1:" + str(socks[0][1]),
15381325Saxel.duch@nginx.com                    "127.0.0.1:" + str(socks[2][1]),
15391325Saxel.duch@nginx.com                ]
15401325Saxel.duch@nginx.com            }
15411325Saxel.duch@nginx.com        )
15421325Saxel.duch@nginx.com        self.assertEqual(self.get(sock=socks[0][0])['status'], 200, 'array')
15431325Saxel.duch@nginx.com        self.assertEqual(self.get(sock=socks[1][0])['status'], 404, 'array 2')
15441325Saxel.duch@nginx.com        self.assertEqual(self.get(sock=socks[2][0])['status'], 200, 'array 3')
15451325Saxel.duch@nginx.com
15461325Saxel.duch@nginx.com    def test_routes_source_addr(self):
15471325Saxel.duch@nginx.com        self.assertIn(
15481325Saxel.duch@nginx.com            'success',
15491325Saxel.duch@nginx.com            self.conf(
15501325Saxel.duch@nginx.com                {
15511325Saxel.duch@nginx.com                    "*:7080": {"pass": "routes"},
15521325Saxel.duch@nginx.com                    "[::1]:7081": {"pass": "routes"},
15531325Saxel.duch@nginx.com                },
15541325Saxel.duch@nginx.com                'listeners',
15551325Saxel.duch@nginx.com            ),
15561325Saxel.duch@nginx.com            'source listeners configure',
15571325Saxel.duch@nginx.com        )
15581325Saxel.duch@nginx.com
15591325Saxel.duch@nginx.com        def get_ipv6():
15601325Saxel.duch@nginx.com            return self.get(sock_type='ipv6', port=7081)
15611325Saxel.duch@nginx.com
15621325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.1"})
15631325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 200, 'exact')
15641325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 404, 'exact ipv6')
15651325Saxel.duch@nginx.com
15661325Saxel.duch@nginx.com        self.route_match({"source": ["127.0.0.1"]})
15671325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 200, 'exact 2')
15681325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 404, 'exact 2 ipv6')
15691325Saxel.duch@nginx.com
15701325Saxel.duch@nginx.com        self.route_match({"source": "!127.0.0.1"})
15711325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 404, 'exact neg')
15721325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 200, 'exact neg ipv6')
15731325Saxel.duch@nginx.com
15741325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.2"})
15751325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 404, 'exact 3')
15761325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 404, 'exact 3 ipv6')
15771325Saxel.duch@nginx.com
15781325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.1-127.0.0.1"})
15791325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 200, 'range single')
15801325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 404, 'range single ipv6')
15811325Saxel.duch@nginx.com
15821325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.2-127.0.0.2"})
15831325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 404, 'range single 2')
15841325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 404, 'range single 2 ipv6')
15851325Saxel.duch@nginx.com
15861325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.2-127.0.0.3"})
15871325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 404, 'range')
15881325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 404, 'range ipv6')
15891325Saxel.duch@nginx.com
15901325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.1-127.0.0.2"})
15911325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 200, 'range 2')
15921325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 404, 'range 2 ipv6')
15931325Saxel.duch@nginx.com
15941325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.0-127.0.0.2"})
15951325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 200, 'range 3')
15961325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 404, 'range 3 ipv6')
15971325Saxel.duch@nginx.com
15981325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.0-127.0.0.1"})
15991325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 200, 'range 4')
16001325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 404, 'range 4 ipv6')
16011325Saxel.duch@nginx.com
16021325Saxel.duch@nginx.com        self.route_match({"source": "126.0.0.0-127.0.0.0"})
16031325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 404, 'range 5')
16041325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 404, 'range 5 ipv6')
16051325Saxel.duch@nginx.com
16061325Saxel.duch@nginx.com        self.route_match({"source": "126.126.126.126-127.0.0.2"})
16071325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 200, 'range 6')
16081325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 404, 'range 6 ipv6')
16091325Saxel.duch@nginx.com
16101325Saxel.duch@nginx.com    def test_routes_source_ipv6(self):
16111325Saxel.duch@nginx.com        self.assertIn(
16121325Saxel.duch@nginx.com            'success',
16131325Saxel.duch@nginx.com            self.conf(
16141325Saxel.duch@nginx.com                {
16151325Saxel.duch@nginx.com                    "[::1]:7080": {"pass": "routes"},
16161325Saxel.duch@nginx.com                    "127.0.0.1:7081": {"pass": "routes"},
16171325Saxel.duch@nginx.com                },
16181325Saxel.duch@nginx.com                'listeners',
16191325Saxel.duch@nginx.com            ),
16201325Saxel.duch@nginx.com            'source listeners configure',
16211325Saxel.duch@nginx.com        )
16221325Saxel.duch@nginx.com
16231325Saxel.duch@nginx.com        self.route_match({"source": "::1"})
16241325Saxel.duch@nginx.com        self.assertEqual(self.get(sock_type='ipv6')['status'], 200, 'exact')
16251325Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, 'exact ipv4')
16261325Saxel.duch@nginx.com
16271325Saxel.duch@nginx.com        self.route_match({"source": ["::1"]})
16281325Saxel.duch@nginx.com        self.assertEqual(self.get(sock_type='ipv6')['status'], 200, 'exact 2')
16291325Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, 'exact 2 ipv4')
16301325Saxel.duch@nginx.com
16311325Saxel.duch@nginx.com        self.route_match({"source": "!::1"})
16321325Saxel.duch@nginx.com        self.assertEqual(self.get(sock_type='ipv6')['status'], 404, 'exact neg')
16331325Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 200, 'exact neg ipv4')
16341325Saxel.duch@nginx.com
16351325Saxel.duch@nginx.com        self.route_match({"source": "::2"})
16361325Saxel.duch@nginx.com        self.assertEqual(self.get(sock_type='ipv6')['status'], 404, 'exact 3')
16371325Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, 'exact 3 ipv4')
16381325Saxel.duch@nginx.com
16391325Saxel.duch@nginx.com        self.route_match({"source": "::1-::1"})
16401325Saxel.duch@nginx.com        self.assertEqual(self.get(sock_type='ipv6')['status'], 200, 'range')
16411325Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, 'range ipv4')
16421325Saxel.duch@nginx.com
16431325Saxel.duch@nginx.com        self.route_match({"source": "::2-::2"})
16441325Saxel.duch@nginx.com        self.assertEqual(self.get(sock_type='ipv6')['status'], 404, 'range 2')
16451325Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, 'range 2 ipv4')
16461325Saxel.duch@nginx.com
16471325Saxel.duch@nginx.com        self.route_match({"source": "::2-::3"})
16481325Saxel.duch@nginx.com        self.assertEqual(self.get(sock_type='ipv6')['status'], 404, 'range 3')
16491325Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, 'range 3 ipv4')
16501325Saxel.duch@nginx.com
16511325Saxel.duch@nginx.com        self.route_match({"source": "::1-::2"})
16521325Saxel.duch@nginx.com        self.assertEqual(self.get(sock_type='ipv6')['status'], 200, 'range 4')
16531325Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, 'range 4 ipv4')
16541325Saxel.duch@nginx.com
16551325Saxel.duch@nginx.com        self.route_match({"source": "::0-::2"})
16561325Saxel.duch@nginx.com        self.assertEqual(self.get(sock_type='ipv6')['status'], 200, 'range 5')
16571325Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, 'range 5 ipv4')
16581325Saxel.duch@nginx.com
16591325Saxel.duch@nginx.com        self.route_match({"source": "::0-::1"})
16601325Saxel.duch@nginx.com        self.assertEqual(self.get(sock_type='ipv6')['status'], 200, 'range 6')
16611325Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, 'range 6 ipv4')
16621325Saxel.duch@nginx.com
16631325Saxel.duch@nginx.com    def test_routes_source_cidr(self):
16641325Saxel.duch@nginx.com        self.assertIn(
16651325Saxel.duch@nginx.com            'success',
16661325Saxel.duch@nginx.com            self.conf(
16671325Saxel.duch@nginx.com                {
16681325Saxel.duch@nginx.com                    "*:7080": {"pass": "routes"},
16691325Saxel.duch@nginx.com                    "[::1]:7081": {"pass": "routes"},
16701325Saxel.duch@nginx.com                },
16711325Saxel.duch@nginx.com                'listeners',
16721325Saxel.duch@nginx.com            ),
16731325Saxel.duch@nginx.com            'source listeners configure',
16741325Saxel.duch@nginx.com        )
16751325Saxel.duch@nginx.com
16761325Saxel.duch@nginx.com        def get_ipv6():
16771325Saxel.duch@nginx.com            return self.get(sock_type='ipv6', port=7081)
16781325Saxel.duch@nginx.com
16791325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.1/32"})
16801325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 200, '32')
16811325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 404, '32 ipv6')
16821325Saxel.duch@nginx.com
16831325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.0/32"})
16841325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 404, '32 2')
16851325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 404, '32 2 ipv6')
16861325Saxel.duch@nginx.com
16871325Saxel.duch@nginx.com        self.route_match({"source": "127.0.0.0/31"})
16881325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 200, '31')
16891325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 404, '31 ipv6')
16901325Saxel.duch@nginx.com
16911325Saxel.duch@nginx.com        self.route_match({"source": "0.0.0.0/1"})
16921325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 200, '1')
16931325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 404, '1 ipv6')
16941325Saxel.duch@nginx.com
16951325Saxel.duch@nginx.com        self.route_match({"source": "0.0.0.0/0"})
16961325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 200, '0')
16971325Saxel.duch@nginx.com        self.assertEqual(get_ipv6()['status'], 404, '0 ipv6')
16981325Saxel.duch@nginx.com
16991325Saxel.duch@nginx.com    def test_routes_source_cidr_ipv6(self):
17001325Saxel.duch@nginx.com        self.assertIn(
17011325Saxel.duch@nginx.com            'success',
17021325Saxel.duch@nginx.com            self.conf(
17031325Saxel.duch@nginx.com                {
17041325Saxel.duch@nginx.com                    "[::1]:7080": {"pass": "routes"},
17051325Saxel.duch@nginx.com                    "127.0.0.1:7081": {"pass": "routes"},
17061325Saxel.duch@nginx.com                },
17071325Saxel.duch@nginx.com                'listeners',
17081325Saxel.duch@nginx.com            ),
17091325Saxel.duch@nginx.com            'source listeners configure',
17101325Saxel.duch@nginx.com        )
17111325Saxel.duch@nginx.com
17121325Saxel.duch@nginx.com        self.route_match({"source": "::1/128"})
17131325Saxel.duch@nginx.com        self.assertEqual(self.get(sock_type='ipv6')['status'], 200, '128')
17141325Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, '128 ipv4')
17151325Saxel.duch@nginx.com
17161325Saxel.duch@nginx.com        self.route_match({"source": "::0/128"})
17171325Saxel.duch@nginx.com        self.assertEqual(self.get(sock_type='ipv6')['status'], 404, '128 2')
17181325Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, '128 ipv4')
17191325Saxel.duch@nginx.com
17201325Saxel.duch@nginx.com        self.route_match({"source": "::0/127"})
17211325Saxel.duch@nginx.com        self.assertEqual(self.get(sock_type='ipv6')['status'], 200, '127')
17221325Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, '127 ipv4')
17231325Saxel.duch@nginx.com
17241325Saxel.duch@nginx.com        self.route_match({"source": "::0/32"})
17251325Saxel.duch@nginx.com        self.assertEqual(self.get(sock_type='ipv6')['status'], 200, '32')
17261325Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, '32 ipv4')
17271325Saxel.duch@nginx.com
17281325Saxel.duch@nginx.com        self.route_match({"source": "::0/1"})
17291325Saxel.duch@nginx.com        self.assertEqual(self.get(sock_type='ipv6')['status'], 200, '1')
17301325Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, '1 ipv4')
17311325Saxel.duch@nginx.com
17321325Saxel.duch@nginx.com        self.route_match({"source": "::/0"})
17331325Saxel.duch@nginx.com        self.assertEqual(self.get(sock_type='ipv6')['status'], 200, '0')
17341325Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, '0 ipv4')
17351325Saxel.duch@nginx.com
17361325Saxel.duch@nginx.com    def test_routes_source_unix(self):
17371325Saxel.duch@nginx.com        addr = self.testdir + '/sock'
17381325Saxel.duch@nginx.com
17391325Saxel.duch@nginx.com        self.assertIn(
17401325Saxel.duch@nginx.com            'success',
17411325Saxel.duch@nginx.com            self.conf({"unix:" + addr: {"pass": "routes"}}, 'listeners'),
17421325Saxel.duch@nginx.com            'source listeners configure',
17431325Saxel.duch@nginx.com        )
17441325Saxel.duch@nginx.com
17451325Saxel.duch@nginx.com        self.route_match({"source": "!0.0.0.0/0"})
17461325Saxel.duch@nginx.com        self.assertEqual(
17471325Saxel.duch@nginx.com            self.get(sock_type='unix', addr=addr)['status'], 200, 'unix ipv4'
17481325Saxel.duch@nginx.com        )
17491325Saxel.duch@nginx.com
17501325Saxel.duch@nginx.com        self.route_match({"source": "!::/0"})
17511325Saxel.duch@nginx.com        self.assertEqual(
17521325Saxel.duch@nginx.com            self.get(sock_type='unix', addr=addr)['status'], 200, 'unix ipv6'
17531325Saxel.duch@nginx.com        )
17541325Saxel.duch@nginx.com
17551325Saxel.duch@nginx.com    def test_routes_match_source(self):
17561325Saxel.duch@nginx.com        self.route_match({"source": "::"})
17571325Saxel.duch@nginx.com        self.route_match(
17581325Saxel.duch@nginx.com            {
17591325Saxel.duch@nginx.com                "source": [
17601325Saxel.duch@nginx.com                    "127.0.0.1",
17611325Saxel.duch@nginx.com                    "192.168.0.10:8080",
17621325Saxel.duch@nginx.com                    "192.168.0.11:8080-8090",
17631325Saxel.duch@nginx.com                ]
17641325Saxel.duch@nginx.com            }
17651325Saxel.duch@nginx.com        )
17661325Saxel.duch@nginx.com        self.route_match(
17671325Saxel.duch@nginx.com            {
17681325Saxel.duch@nginx.com                "source": [
17691325Saxel.duch@nginx.com                    "10.0.0.0/8",
17701325Saxel.duch@nginx.com                    "10.0.0.0/7:1000",
17711325Saxel.duch@nginx.com                    "10.0.0.0/32:8080-8090",
17721325Saxel.duch@nginx.com                ]
17731325Saxel.duch@nginx.com            }
17741325Saxel.duch@nginx.com        )
17751325Saxel.duch@nginx.com        self.route_match(
17761325Saxel.duch@nginx.com            {
17771325Saxel.duch@nginx.com                "source": [
17781325Saxel.duch@nginx.com                    "10.0.0.0-10.0.0.1",
17791325Saxel.duch@nginx.com                    "10.0.0.0-11.0.0.0:1000",
17801325Saxel.duch@nginx.com                    "127.0.0.0-127.0.0.255:8080-8090",
17811325Saxel.duch@nginx.com                ]
17821325Saxel.duch@nginx.com            }
17831325Saxel.duch@nginx.com        )
17841325Saxel.duch@nginx.com        self.route_match(
17851325Saxel.duch@nginx.com            {"source": ["2001::", "[2002::]:8000", "[2003::]:8080-8090"]}
17861325Saxel.duch@nginx.com        )
17871325Saxel.duch@nginx.com        self.route_match(
17881325Saxel.duch@nginx.com            {
17891325Saxel.duch@nginx.com                "source": [
17901325Saxel.duch@nginx.com                    "2001::-200f:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
17911325Saxel.duch@nginx.com                    "[fe08::-feff::]:8000",
17921325Saxel.duch@nginx.com                    "[fff0::-fff0::10]:8080-8090",
17931325Saxel.duch@nginx.com                ]
17941325Saxel.duch@nginx.com            }
17951325Saxel.duch@nginx.com        )
17961325Saxel.duch@nginx.com        self.route_match(
17971325Saxel.duch@nginx.com            {
17981325Saxel.duch@nginx.com                "source": [
17991325Saxel.duch@nginx.com                    "2001::/16",
18001325Saxel.duch@nginx.com                    "[0ff::/64]:8000",
18011325Saxel.duch@nginx.com                    "[fff0:abcd:ffff:ffff:ffff::/128]:8080-8090",
18021325Saxel.duch@nginx.com                ]
18031325Saxel.duch@nginx.com            }
18041325Saxel.duch@nginx.com        )
18051325Saxel.duch@nginx.com        self.route_match({"source": "*:0-65535"})
18061325Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 200, 'source any')
18071325Saxel.duch@nginx.com
18081325Saxel.duch@nginx.com    def test_routes_match_source_invalid(self):
18091325Saxel.duch@nginx.com        self.route_match_invalid({"source": "127"})
18101325Saxel.duch@nginx.com        self.route_match_invalid({"source": "256.0.0.1"})
18111325Saxel.duch@nginx.com        self.route_match_invalid({"source": "127.0.0."})
18121391Szelenkov@nginx.com        self.route_match_invalid({"source": " 127.0.0.1"})
18131325Saxel.duch@nginx.com        self.route_match_invalid({"source": "127.0.0.1:"})
18141325Saxel.duch@nginx.com        self.route_match_invalid({"source": "127.0.0.1/"})
18151325Saxel.duch@nginx.com        self.route_match_invalid({"source": "11.0.0.0/33"})
18161325Saxel.duch@nginx.com        self.route_match_invalid({"source": "11.0.0.0/65536"})
18171325Saxel.duch@nginx.com        self.route_match_invalid({"source": "11.0.0.0-10.0.0.0"})
18181325Saxel.duch@nginx.com        self.route_match_invalid({"source": "11.0.0.0:3000-2000"})
18191325Saxel.duch@nginx.com        self.route_match_invalid({"source": ["11.0.0.0:3000-2000"]})
18201325Saxel.duch@nginx.com        self.route_match_invalid({"source": "[2001::]:3000-2000"})
18211325Saxel.duch@nginx.com        self.route_match_invalid({"source": "2001::-2000::"})
18221325Saxel.duch@nginx.com        self.route_match_invalid({"source": "2001::/129"})
18231325Saxel.duch@nginx.com        self.route_match_invalid({"source": "::FFFFF"})
18241325Saxel.duch@nginx.com        self.route_match_invalid({"source": "[::1]:"})
18251370Szelenkov@nginx.com        self.route_match_invalid({"source": "[:::]:7080"})
18261325Saxel.duch@nginx.com        self.route_match_invalid({"source": "*:"})
18271325Saxel.duch@nginx.com        self.route_match_invalid({"source": "*:1-a"})
18281325Saxel.duch@nginx.com        self.route_match_invalid({"source": "*:65536"})
18291325Saxel.duch@nginx.com
18301327Saxel.duch@nginx.com    def test_routes_match_destination(self):
18311327Saxel.duch@nginx.com        self.assertIn(
18321327Saxel.duch@nginx.com            'success',
18331327Saxel.duch@nginx.com            self.conf(
18341327Saxel.duch@nginx.com                {"*:7080": {"pass": "routes"}, "*:7081": {"pass": "routes"}},
18351327Saxel.duch@nginx.com                'listeners',
18361327Saxel.duch@nginx.com            ),
18371327Saxel.duch@nginx.com            'listeners configure',
18381327Saxel.duch@nginx.com        )
18391327Saxel.duch@nginx.com
18401327Saxel.duch@nginx.com        self.route_match({"destination": "*:7080"})
18411327Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 200, 'dest')
18421327Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, 'dest 2')
18431327Saxel.duch@nginx.com
18441327Saxel.duch@nginx.com        self.route_match({"destination": ["127.0.0.1:7080"]})
18451327Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 200, 'dest 3')
18461327Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, 'dest 4')
18471327Saxel.duch@nginx.com
18481327Saxel.duch@nginx.com        self.route_match({"destination": "!*:7080"})
18491327Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 404, 'dest neg')
18501327Saxel.duch@nginx.com        self.assertEqual(self.get(port=7081)['status'], 200, 'dest neg 2')
18511327Saxel.duch@nginx.com
18521391Szelenkov@nginx.com        self.route_match({"destination": ['!*:7080', '!*:7081']})
18531391Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'dest neg 3')
18541391Szelenkov@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, 'dest neg 4')
18551391Szelenkov@nginx.com
18561391Szelenkov@nginx.com        self.route_match({"destination": ['!*:7081', '!*:7082']})
18571391Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'dest neg 5')
18581391Szelenkov@nginx.com
18591391Szelenkov@nginx.com        self.route_match({"destination": ['*:7080', '!*:7080']})
18601391Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'dest neg 6')
18611391Szelenkov@nginx.com
18621391Szelenkov@nginx.com        self.route_match(
18631391Szelenkov@nginx.com            {"destination": ['127.0.0.1:7080', '*:7081', '!*:7080']}
18641391Szelenkov@nginx.com        )
18651391Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'dest neg 7')
18661391Szelenkov@nginx.com        self.assertEqual(self.get(port=7081)['status'], 200, 'dest neg 8')
18671391Szelenkov@nginx.com
18681391Szelenkov@nginx.com        self.route_match({"destination": ['!*:7081', '!*:7082', '*:7083']})
18691391Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'dest neg 9')
18701391Szelenkov@nginx.com
18711391Szelenkov@nginx.com        self.route_match(
18721391Szelenkov@nginx.com            {"destination": ['*:7081', '!127.0.0.1:7080', '*:7080']}
18731391Szelenkov@nginx.com        )
18741391Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'dest neg 10')
18751391Szelenkov@nginx.com        self.assertEqual(self.get(port=7081)['status'], 200, 'dest neg 11')
18761391Szelenkov@nginx.com
18771391Szelenkov@nginx.com        self.assertIn(
18781391Szelenkov@nginx.com            'success',
18791391Szelenkov@nginx.com            self.conf_delete('routes/0/match/destination/0'),
18801391Szelenkov@nginx.com            'remove destination rule',
18811391Szelenkov@nginx.com        )
18821391Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'dest neg 12')
18831391Szelenkov@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, 'dest neg 13')
18841391Szelenkov@nginx.com
18851391Szelenkov@nginx.com        self.assertIn(
18861391Szelenkov@nginx.com            'success',
18871391Szelenkov@nginx.com            self.conf_delete('routes/0/match/destination/0'),
18881391Szelenkov@nginx.com            'remove destination rule 2',
18891391Szelenkov@nginx.com        )
18901391Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'dest neg 14')
18911391Szelenkov@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, 'dest neg 15')
18921391Szelenkov@nginx.com
18931391Szelenkov@nginx.com        self.assertIn(
18941391Szelenkov@nginx.com            'success',
18951391Szelenkov@nginx.com            self.conf_post("\"!127.0.0.1\"", 'routes/0/match/destination'),
18961391Szelenkov@nginx.com            'add destination rule',
18971391Szelenkov@nginx.com        )
18981391Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 404, 'dest neg 16')
18991391Szelenkov@nginx.com        self.assertEqual(self.get(port=7081)['status'], 404, 'dest neg 17')
19001391Szelenkov@nginx.com
19011327Saxel.duch@nginx.com    def test_routes_match_destination_proxy(self):
19021327Saxel.duch@nginx.com        self.assertIn(
19031327Saxel.duch@nginx.com            'success',
19041327Saxel.duch@nginx.com            self.conf(
19051327Saxel.duch@nginx.com                {
19061327Saxel.duch@nginx.com                    "listeners": {
19071327Saxel.duch@nginx.com                        "*:7080": {"pass": "routes/first"},
19081327Saxel.duch@nginx.com                        "*:7081": {"pass": "routes/second"},
19091327Saxel.duch@nginx.com                    },
19101327Saxel.duch@nginx.com                    "routes": {
19111327Saxel.duch@nginx.com                        "first": [
19121327Saxel.duch@nginx.com                            {"action": {"proxy": "http://127.0.0.1:7081"}}
19131327Saxel.duch@nginx.com                        ],
19141327Saxel.duch@nginx.com                        "second": [
19151327Saxel.duch@nginx.com                            {
19161327Saxel.duch@nginx.com                                "match": {"destination": ["127.0.0.1:7081"]},
19171434Szelenkov@nginx.com                                "action": {"return": 200},
19181327Saxel.duch@nginx.com                            }
19191327Saxel.duch@nginx.com                        ],
19201327Saxel.duch@nginx.com                    },
19211434Szelenkov@nginx.com                    "applications": {},
19221327Saxel.duch@nginx.com                }
19231327Saxel.duch@nginx.com            ),
19241327Saxel.duch@nginx.com            'proxy configure',
19251327Saxel.duch@nginx.com        )
19261327Saxel.duch@nginx.com
19271327Saxel.duch@nginx.com        self.assertEqual(self.get()['status'], 200, 'proxy')
19281110Saxel.duch@nginx.com
19291477Szelenkov@nginx.com
1930972Szelenkov@nginx.comif __name__ == '__main__':
19311019Szelenkov@nginx.com    TestRouting.main()
1932