diff options
author | Marcel Hellkamp <marc@gsites.de> | 2019-12-08 20:09:15 +0100 |
---|---|---|
committer | Marcel Hellkamp <marc@gsites.de> | 2019-12-08 20:09:15 +0100 |
commit | 01b4f9c174e2f4f2845e9ba3519bdac329e5369f (patch) | |
tree | c20d87fc766deafbfdf770444d905400e28c9249 | |
parent | 44b9cf888c8481e0291b5343518f39713be04736 (diff) | |
download | bottle-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.py | 27 |
1 files changed, 18 insertions, 9 deletions
@@ -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 |