summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hellkamp <marc@gsites.de>2019-12-08 20:09:15 +0100
committerMarcel Hellkamp <marc@gsites.de>2019-12-08 20:09:15 +0100
commit01b4f9c174e2f4f2845e9ba3519bdac329e5369f (patch)
treec20d87fc766deafbfdf770444d905400e28c9249
parent44b9cf888c8481e0291b5343518f39713be04736 (diff)
downloadbottle-01b4f9c174e2f4f2845e9ba3519bdac329e5369f.tar.gz
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).
-rw-r--r--bottle.py27
1 files 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