예제 #1
0
파일: routing.py 프로젝트: olivecoder/mamba
    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
예제 #2
0
 def test_not_implemented_code_is_501(self):
     result = response.NotImplemented('/test')
     self.assertEqual(result.code, http.NOT_IMPLEMENTED)