Skip to content

Commit

Permalink
Bug fix for host parameter issue with lists (#1776)
Browse files Browse the repository at this point in the history
* Bug fix for host parameter issue with lists

As explained in #1772 there is an issue when using a list as an argument for the host parameter in the Blueprint.route() decorator. I've traced the issue back to this line, and the if conditional should ensure that the name attribute isn't accessed when route is None.

* Unit tests for blueprint.route host paramter set to list.

Co-authored-by: Adam Hopkins <[email protected]>
  • Loading branch information
damianj and ahopkins authored Jun 28, 2020
1 parent d81096f commit cf9ccda
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 1 deletion.
2 changes: 1 addition & 1 deletion sanic/blueprints.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ def register(self, app, options):
if _routes:
routes += _routes

route_names = [route.name for route in routes]
route_names = [route.name for route in routes if route]
# Middleware
for future in self.middlewares:
if future.args or future.kwargs:
Expand Down
70 changes: 70 additions & 0 deletions tests/test_blueprints.py
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,76 @@ def handler2(request):
assert response.text == "Hello3"


def test_bp_with_host_list(app):
bp = Blueprint("test_bp_host", url_prefix="/test1", host=["example.com", "sub.example.com"])

@bp.route("/")
def handler1(request):
return text("Hello")

@bp.route("/", host=["sub1.example.com"])
def handler2(request):
return text("Hello subdomain!")

app.blueprint(bp)
headers = {"Host": "example.com"}
request, response = app.test_client.get("/test1/", headers=headers)
assert response.text == "Hello"

headers = {"Host": "sub.example.com"}
request, response = app.test_client.get("/test1/", headers=headers)
assert response.text == "Hello"

headers = {"Host": "sub1.example.com"}
request, response = app.test_client.get("/test1/", headers=headers)

assert response.text == "Hello subdomain!"


def test_several_bp_with_host_list(app):
bp = Blueprint("test_text", url_prefix="/test", host=["example.com", "sub.example.com"])
bp2 = Blueprint("test_text2", url_prefix="/test", host=["sub1.example.com", "sub2.example.com"])

@bp.route("/")
def handler(request):
return text("Hello")

@bp2.route("/")
def handler1(request):
return text("Hello2")

@bp2.route("/other/")
def handler2(request):
return text("Hello3")

app.blueprint(bp)
app.blueprint(bp2)

assert bp.host == ["example.com", "sub.example.com"]
headers = {"Host": "example.com"}
request, response = app.test_client.get("/test/", headers=headers)
assert response.text == "Hello"

assert bp.host == ["example.com", "sub.example.com"]
headers = {"Host": "sub.example.com"}
request, response = app.test_client.get("/test/", headers=headers)
assert response.text == "Hello"

assert bp2.host == ["sub1.example.com", "sub2.example.com"]
headers = {"Host": "sub1.example.com"}
request, response = app.test_client.get("/test/", headers=headers)
assert response.text == "Hello2"
request, response = app.test_client.get("/test/other/", headers=headers)
assert response.text == "Hello3"

assert bp2.host == ["sub1.example.com", "sub2.example.com"]
headers = {"Host": "sub2.example.com"}
request, response = app.test_client.get("/test/", headers=headers)
assert response.text == "Hello2"
request, response = app.test_client.get("/test/other/", headers=headers)
assert response.text == "Hello3"


def test_bp_middleware(app):
blueprint = Blueprint("test_bp_middleware")

Expand Down

0 comments on commit cf9ccda

Please sign in to comment.