diff options
author | Ryan Petrello <lists@ryanpetrello.com> | 2012-03-21 15:56:03 -0400 |
---|---|---|
committer | Ryan Petrello <lists@ryanpetrello.com> | 2012-03-21 15:56:03 -0400 |
commit | bc2e143757f34d771ca4faeef3c4ccec83c736b2 (patch) | |
tree | 69dae6b159945a86c5bdb66687eefc2291dfac7a /pecan/middleware | |
parent | bc0425339dbb5ffa8574103977c4f04aa03a9f73 (diff) | |
download | pecan-bc2e143757f34d771ca4faeef3c4ccec83c736b2.tar.gz |
Fixing a few bugs in the debug middleware and legacy iPython support.
Diffstat (limited to 'pecan/middleware')
-rw-r--r-- | pecan/middleware/errordocument.py | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/pecan/middleware/errordocument.py b/pecan/middleware/errordocument.py index 8961968..0c374ae 100644 --- a/pecan/middleware/errordocument.py +++ b/pecan/middleware/errordocument.py @@ -1,6 +1,40 @@ +import sys from recursive import ForwardRequestException +class StatusPersist(object): + + def __init__(self, app, status, url): + self.app = app + self.status = status + self.url = url + + def __call__(self, environ, start_response): + def keep_status_start_response(status, headers, exc_info=None): + return start_response(self.status, headers, exc_info) + parts = self.url.split('?') + environ['PATH_INFO'] = parts[0] + if len(parts) > 1: + environ['QUERY_STRING'] = parts[1] + else: + environ['QUERY_STRING'] = '' + + try: + return self.app(environ, keep_status_start_response) + except RecursionLoop, e: + environ['wsgi.errors'].write( + 'Recursion error getting error page: %s\n' % e + ) + keep_status_start_response( + '500 Server Error', + [('Content-type', 'text/plain')], + sys.exc_info() + ) + return [ + 'Error: %s. (Error page could not be fetched)' % self.status + ] + + class ErrorDocumentMiddleware(object): def __init__(self, app, error_map): @@ -12,14 +46,20 @@ class ErrorDocumentMiddleware(object): def replacement_start_response(status, headers, exc_info=None): try: status_code = status.split(' ')[0] - except ValueError, TypeError: + except (ValueError, TypeError): raise Exception(( 'ErrorDocumentMiddleware received an invalid ' 'status %s' % status )) if status_code in self.error_map: - raise ForwardRequestException(self.error_map[status_code]) + def factory(app): + return StatusPersist( + app, + status, + self.error_map[status_code] + ) + raise ForwardRequestException(factory=factory) return start_response(status, headers, exc_info) |