Replacing `paste.errordocument` middleware with a simpler solution.

This commit is contained in:
Ryan Petrello
2012-03-21 14:40:38 -04:00
parent d2b835c242
commit bc0425339d
4 changed files with 49 additions and 11 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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
]