| from .test_errordocument import simple_app |
| from paste.fixture import * |
| from paste.recursive import RecursiveMiddleware, ForwardRequestException |
| |
| def error_docs_app(environ, start_response): |
| if environ['PATH_INFO'] == '/not_found': |
| start_response("404 Not found", [('Content-type', 'text/plain')]) |
| return [b'Not found'] |
| elif environ['PATH_INFO'] == '/error': |
| start_response("200 OK", [('Content-type', 'text/plain')]) |
| return [b'Page not found'] |
| elif environ['PATH_INFO'] == '/recurse': |
| raise ForwardRequestException('/recurse') |
| else: |
| return simple_app(environ, start_response) |
| |
| class Middleware(object): |
| def __init__(self, app, url='/error'): |
| self.app = app |
| self.url = url |
| def __call__(self, environ, start_response): |
| raise ForwardRequestException(self.url) |
| |
| def forward(app): |
| app = TestApp(RecursiveMiddleware(app)) |
| res = app.get('') |
| assert res.header('content-type') == 'text/plain' |
| assert res.full_status == '200 OK' |
| assert 'requested page returned' in res |
| res = app.get('/error') |
| assert res.header('content-type') == 'text/plain' |
| assert res.full_status == '200 OK' |
| assert 'Page not found' in res |
| res = app.get('/not_found') |
| assert res.header('content-type') == 'text/plain' |
| assert res.full_status == '200 OK' |
| assert 'Page not found' in res |
| try: |
| res = app.get('/recurse') |
| except AssertionError as e: |
| if str(e).startswith('Forwarding loop detected'): |
| pass |
| else: |
| raise AssertionError('Failed to detect forwarding loop') |
| |
| def test_ForwardRequest_url(): |
| class TestForwardRequestMiddleware(Middleware): |
| def __call__(self, environ, start_response): |
| if environ['PATH_INFO'] != '/not_found': |
| return self.app(environ, start_response) |
| raise ForwardRequestException(self.url) |
| forward(TestForwardRequestMiddleware(error_docs_app)) |
| |
| def test_ForwardRequest_environ(): |
| class TestForwardRequestMiddleware(Middleware): |
| def __call__(self, environ, start_response): |
| if environ['PATH_INFO'] != '/not_found': |
| return self.app(environ, start_response) |
| environ['PATH_INFO'] = self.url |
| raise ForwardRequestException(environ=environ) |
| forward(TestForwardRequestMiddleware(error_docs_app)) |
| |
| def test_ForwardRequest_factory(): |
| |
| from paste.errordocument import StatusKeeper |
| |
| class TestForwardRequestMiddleware(Middleware): |
| def __call__(self, environ, start_response): |
| if environ['PATH_INFO'] != '/not_found': |
| return self.app(environ, start_response) |
| environ['PATH_INFO'] = self.url |
| def factory(app): |
| return StatusKeeper(app, status='404 Not Found', url='/error', headers=[]) |
| raise ForwardRequestException(factory=factory) |
| |
| app = TestForwardRequestMiddleware(error_docs_app) |
| app = TestApp(RecursiveMiddleware(app)) |
| res = app.get('') |
| assert res.header('content-type') == 'text/plain' |
| assert res.full_status == '200 OK' |
| assert 'requested page returned' in res |
| res = app.get('/error') |
| assert res.header('content-type') == 'text/plain' |
| assert res.full_status == '200 OK' |
| assert 'Page not found' in res |
| res = app.get('/not_found', status=404) |
| assert res.header('content-type') == 'text/plain' |
| assert res.full_status == '404 Not Found' # Different status |
| assert 'Page not found' in res |
| try: |
| res = app.get('/recurse') |
| except AssertionError as e: |
| if str(e).startswith('Forwarding loop detected'): |
| pass |
| else: |
| raise AssertionError('Failed to detect forwarding loop') |
| |
| # Test Deprecated Code |
| def test_ForwardRequestException(): |
| class TestForwardRequestExceptionMiddleware(Middleware): |
| def __call__(self, environ, start_response): |
| if environ['PATH_INFO'] != '/not_found': |
| return self.app(environ, start_response) |
| raise ForwardRequestException(path_info=self.url) |
| forward(TestForwardRequestExceptionMiddleware(error_docs_app)) |