From bc0425339dbb5ffa8574103977c4f04aa03a9f73 Mon Sep 17 00:00:00 2001 From: Ryan Petrello Date: Wed, 21 Mar 2012 14:40:38 -0400 Subject: [PATCH] Replacing ``paste.errordocument`` middleware with a simpler solution. --- pecan/__init__.py | 11 +++++----- pecan/middleware/errordocument.py | 27 ++++++++++++++++++++++++ pecan/tests/middleware/test_recursive.py | 21 ++++++++++++++---- setup.py | 1 - 4 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 pecan/middleware/errordocument.py diff --git a/pecan/__init__.py b/pecan/__init__.py index 2500c5f..aeb0cd0 100644 --- a/pecan/__init__.py +++ b/pecan/__init__.py @@ -1,5 +1,3 @@ -from paste.errordocument import make_errordocument - from core import ( abort, override_template, Pecan, load_app, redirect, render, request, response @@ -7,6 +5,7 @@ from core import ( from decorators import expose from hooks import RequestViewerHook from middleware.debug import DebugMiddleware +from middleware.errordocument import ErrorDocumentMiddleware from middleware.logger import TransLogger from middleware.recursive import RecursiveMiddleware from middleware.static import SharedDataMiddleware @@ -38,6 +37,10 @@ def make_app(root, static_root=None, debug=False, errorcfg={}, if wrap_app: app = wrap_app(app) + # Configuration for serving custom error messages + if hasattr(conf.app, 'errors'): + app = ErrorDocumentMiddleware(app, conf.app.errors) + # Included for internal redirect support app = RecursiveMiddleware(app) @@ -45,10 +48,6 @@ def make_app(root, static_root=None, debug=False, errorcfg={}, if debug: app = DebugMiddleware(app) - # Configuration for serving custom error messages - if hasattr(conf.app, 'errors'): - app = make_errordocument(app, conf, **dict(conf.app.errors)) - # Support for serving static files (for development convenience) if static_root: app = SharedDataMiddleware(app, static_root) diff --git a/pecan/middleware/errordocument.py b/pecan/middleware/errordocument.py new file mode 100644 index 0000000..8961968 --- /dev/null +++ b/pecan/middleware/errordocument.py @@ -0,0 +1,27 @@ +from recursive import ForwardRequestException + + +class ErrorDocumentMiddleware(object): + + def __init__(self, app, error_map): + self.app = app + self.error_map = error_map + + def __call__(self, environ, start_response): + + def replacement_start_response(status, headers, exc_info=None): + try: + status_code = status.split(' ')[0] + 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]) + + return start_response(status, headers, exc_info) + + app_iter = self.app(environ, replacement_start_response) + return app_iter diff --git a/pecan/tests/middleware/test_recursive.py b/pecan/tests/middleware/test_recursive.py index 04732fa..e34733b 100644 --- a/pecan/tests/middleware/test_recursive.py +++ b/pecan/tests/middleware/test_recursive.py @@ -84,7 +84,6 @@ class TestRecursiveMiddleware(TestCase): forward(TestForwardRequestMiddleware(error_docs_app)) def test_ForwardRequest_factory(self): - from paste.errordocument import StatusKeeper class TestForwardRequestMiddleware(Middleware): def __call__(self, environ, start_response): @@ -93,9 +92,23 @@ class TestRecursiveMiddleware(TestCase): environ['PATH_INFO'] = self.url def factory(app): - return StatusKeeper(app, - status='404 Not Found', url='/error', headers=[] - ) + + class WSGIApp(object): + + def __init__(self, app): + self.app = app + + def __call__(self, e, start_response): + def keep_status_start_response( + status, headers, exc_info=None + ): + return start_response( + '404', headers, exc_info + ) + return self.app(e, keep_status_start_response) + + return WSGIApp(app) + raise ForwardRequestException(factory=factory) app = TestForwardRequestMiddleware(error_docs_app) diff --git a/setup.py b/setup.py index 13e8172..7b9ebb8 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,6 @@ requirements = [ "WebOb >= 1.2dev", # py3 compat "simplegeneric >= 0.8", # py3 compat "Mako >= 0.4.0", - "Paste >= 1.7.5.1", "WebTest >= 1.3.1" # py3 compat ]