def dispatch(self, controller, request): """Dispatch a route and return back the appropiate response. :param controller: the mamba controller :type controller: :class:`~mamba.Controller` :param request: the HTTP request :type request: :class:`twisted.web.server.Request` """ try: route = RouteDispatcher(self, controller, request).lookup() if type(route) is Route: # at this point we can get a Deferred or an inmediate result # depending on the user code result = defer.maybeDeferred(route, controller, request) result.addCallback(self._process, request) result.addErrback(self._process_error, request) elif route == 'NotImplemented': result = defer.succeed(response.NotImplemented( UrlSanitizer().sanitize_container( [controller.get_register_path()] + request.postpath ) )) else: msg = 'ERROR 404: {} not found'.format( UrlSanitizer().sanitize_container( [controller.get_register_path()] + request.postpath ) ) result = defer.succeed(response.NotFound( msg, {'content-type': 'text/plain'} )) except TypeError as error: log.msg(error, logLevel=logging.WARN) result = defer.succeed(response.BadRequest( str(error), {'content-type': 'text/plain'} )) except Exception as error: log.err(error) result = response.InternalServerError( 'ERROR 500: Internal server error: {}\n\t{}'.format( type(error), error ) ) return result
def test_response_not_found_code_is_404(self): result = response.NotFound('') self.assertEqual(result.code, http.NOT_FOUND)