From cf9ccdae47bacb8ab7e88fc1ae242e69c5ee66cd Mon Sep 17 00:00:00 2001 From: Damian Jimenez Date: Sun, 28 Jun 2020 01:42:18 -0500 Subject: [PATCH] Bug fix for host parameter issue with lists (#1776) * 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 --- sanic/blueprints.py | 2 +- tests/test_blueprints.py | 70 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/sanic/blueprints.py b/sanic/blueprints.py index 45073078..42599342 100644 --- a/sanic/blueprints.py +++ b/sanic/blueprints.py @@ -143,7 +143,7 @@ class Blueprint: 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: diff --git a/tests/test_blueprints.py b/tests/test_blueprints.py index 6d5404d3..00bee043 100644 --- a/tests/test_blueprints.py +++ b/tests/test_blueprints.py @@ -252,6 +252,76 @@ def test_several_bp_with_host(app): 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")