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