From ed9775fb77bc2291473c176937326aadd435f73c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarek=20Pi=C3=B3rkowski?= Date: Mon, 12 Nov 2018 16:59:09 -0500 Subject: [PATCH] Handle errors during create_url_adapter If create_url_adapter raises (which it can if werkzeug cannot bind environment, for example on non-ASCII Host header), we handle it as other routing exceptions rather than raising through. ref https://github.com/pallets/werkzeug/issues/640 --- flask/ctx.py | 9 +++++++-- tests/test_reqctx.py | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/flask/ctx.py b/flask/ctx.py index e41adbd2..f8cdb60b 100644 --- a/flask/ctx.py +++ b/flask/ctx.py @@ -282,7 +282,11 @@ class RequestContext(object): if request is None: request = app.request_class(environ) self.request = request - self.url_adapter = app.create_url_adapter(self.request) + self.url_adapter = None + try: + self.url_adapter = app.create_url_adapter(self.request) + except HTTPException as e: + self.request.routing_exception = e self.flashes = None self.session = session @@ -305,7 +309,8 @@ class RequestContext(object): # functions. self._after_request_functions = [] - self.match_request() + if self.url_adapter is not None: + self.match_request() def _get_g(self): return _app_ctx_stack.top.g diff --git a/tests/test_reqctx.py b/tests/test_reqctx.py index d8ef4970..dfdd95ae 100644 --- a/tests/test_reqctx.py +++ b/tests/test_reqctx.py @@ -229,3 +229,26 @@ def test_session_error_pops_context(): assert response.status_code == 500 assert not flask.request assert not flask.current_app + + +def test_bad_environ_raises_bad_request(): + app = flask.Flask(__name__) + + @app.route('/') + def index(): + # shouldn't get here anyway + assert False + + response = app.test_client().get('/', headers={'host': 'ąśź.com'}) + assert response.status_code == 400 + + +def test_normal_environ_completes(): + app = flask.Flask(__name__) + + @app.route('/') + def index(): + return 'Hello World!' + + response = app.test_client().get('/', headers={'host': 'xn--on-0ia.com'}) + assert response.status_code == 200