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