Replacing `paste.errordocument` middleware with a simpler solution.
This commit is contained in:
@@ -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)
|
||||
|
||||
27
pecan/middleware/errordocument.py
Normal file
27
pecan/middleware/errordocument.py
Normal 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
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user