Skip to content

Commit ed9775f

Browse files
committed
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 pallets/werkzeug#640
1 parent 3394191 commit ed9775f

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

flask/ctx.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,11 @@ def __init__(self, app, environ, request=None, session=None):
282282
if request is None:
283283
request = app.request_class(environ)
284284
self.request = request
285-
self.url_adapter = app.create_url_adapter(self.request)
285+
self.url_adapter = None
286+
try:
287+
self.url_adapter = app.create_url_adapter(self.request)
288+
except HTTPException as e:
289+
self.request.routing_exception = e
286290
self.flashes = None
287291
self.session = session
288292

@@ -305,7 +309,8 @@ def __init__(self, app, environ, request=None, session=None):
305309
# functions.
306310
self._after_request_functions = []
307311

308-
self.match_request()
312+
if self.url_adapter is not None:
313+
self.match_request()
309314

310315
def _get_g(self):
311316
return _app_ctx_stack.top.g

tests/test_reqctx.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,3 +229,26 @@ def index():
229229
assert response.status_code == 500
230230
assert not flask.request
231231
assert not flask.current_app
232+
233+
234+
def test_bad_environ_raises_bad_request():
235+
app = flask.Flask(__name__)
236+
237+
@app.route('/')
238+
def index():
239+
# shouldn't get here anyway
240+
assert False
241+
242+
response = app.test_client().get('/', headers={'host': 'ąśź.com'})
243+
assert response.status_code == 400
244+
245+
246+
def test_normal_environ_completes():
247+
app = flask.Flask(__name__)
248+
249+
@app.route('/')
250+
def index():
251+
return 'Hello World!'
252+
253+
response = app.test_client().get('/', headers={'host': 'xn--on-0ia.com'})
254+
assert response.status_code == 200

0 commit comments

Comments
 (0)