summaryrefslogtreecommitdiff
path: root/pecan/middleware
diff options
context:
space:
mode:
authorRyan Petrello <lists@ryanpetrello.com>2012-03-21 15:56:03 -0400
committerRyan Petrello <lists@ryanpetrello.com>2012-03-21 15:56:03 -0400
commitbc2e143757f34d771ca4faeef3c4ccec83c736b2 (patch)
tree69dae6b159945a86c5bdb66687eefc2291dfac7a /pecan/middleware
parentbc0425339dbb5ffa8574103977c4f04aa03a9f73 (diff)
downloadpecan-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.py44
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)