From 01b4f9c174e2f4f2845e9ba3519bdac329e5369f Mon Sep 17 00:00:00 2001 From: Marcel Hellkamp Date: Sun, 8 Dec 2019 20:09:15 +0100 Subject: fix #1125: Make sure after_request can set headers. This is a backport of the 0.13 _handle() logic and only changes undefined/undocumented behavior (for the better). --- bottle.py | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/bottle.py b/bottle.py index 96ca3e4..0fa8758 100644 --- a/bottle.py +++ b/bottle.py @@ -859,28 +859,37 @@ class Bottle(object): environ['bottle.app'] = self request.bind(environ) response.bind() + out = None try: self.trigger_hook('before_request') route, args = self.router.match(environ) environ['route.handle'] = route environ['bottle.route'] = route environ['route.url_args'] = args - return route.call(**args) + out = route.call(**args) + except RouteReset: + route.reset() + return self._handle(environ) + except HTTPResponse: + out = _e() finally: - self.trigger_hook('after_request') - - except HTTPResponse: - return _e() - except RouteReset: - route.reset() - return self._handle(environ) + if isinstance(out, HTTPResponse): + out.apply(response) + try: + self.trigger_hook('after_request') + except HTTPResponse: + out = _e() + out.apply(response) except (KeyboardInterrupt, SystemExit, MemoryError): raise except Exception: if not self.catchall: raise stacktrace = format_exc() environ['wsgi.errors'].write(stacktrace) - return HTTPError(500, "Internal Server Error", _e(), stacktrace) + environ['wsgi.errors'].flush() + out = HTTPError(500, "Internal Server Error", _e(), stacktrace) + out.apply(response) + return out def _cast(self, out, peek=None): """ Try to convert the parameter into something WSGI compatible and set -- cgit v1.2.1