コード例 #1
0
def prepare_middleware(middleware=None):
    """Check middleware interface and prepare it to iterate.

    Args:
        middleware:  list (or object) of input middleware

    Returns:
        list: A list of prepared middleware tuples
    """

    # PERF(kgriffs): do getattr calls once, in advance, so we don't
    # have to do them every time in the request path.
    prepared_middleware = []

    if middleware is None:
        middleware = []
    else:
        if not isinstance(middleware, list):
            middleware = [middleware]

    for component in middleware:
        process_request = util.get_bound_method(component,
                                                'process_request')
        process_resource = util.get_bound_method(component,
                                                 'process_resource')
        process_response = util.get_bound_method(component,
                                                 'process_response')

        if not (process_request or process_resource or process_response):
            msg = '{0} does not implement the middleware interface'
            raise TypeError(msg.format(component))

        if process_response:
            # NOTE(kgriffs): Shim older implementations to ensure
            # backwards-compatibility.
            args = util.get_argnames(process_response)

            if len(args) == 3:  # (req, resp, resource)
                def let(process_response=process_response):
                    @wraps(process_response)
                    def shim(req, resp, resource, req_succeeded):
                        process_response(req, resp, resource)

                    return shim

                process_response = let()

        prepared_middleware.append((process_request, process_resource,
                                    process_response))

    return prepared_middleware
コード例 #2
0
ファイル: api_helpers.py プロジェクト: jmvrbanac/falcon
def make_router_search(router):
    """Create a search function for routing requests.

    Args:
        router(object): An object that implements the routing engine
            interface.

    Returns:
        callable: A function that accepts a request and invokes the
            router's find method.
    """

    arg_names = util.get_argnames(router.find)
    supports_req = 'req' in arg_names and len(arg_names) > 1

    if supports_req:
        return router.find

    def search_shim(path, req):
        return router.find(path)

    return search_shim
コード例 #3
0
ファイル: api_helpers.py プロジェクト: rajib2k5/falcon
def make_router_search(router):
    """Create a search function for routing requests.

    Args:
        router(object): An object that implements the routing engine
            interface.

    Returns:
        callable: A function that accepts a request and invokes the
            router's find method.
    """

    arg_names = util.get_argnames(router.find)
    supports_req = 'req' in arg_names and len(arg_names) > 1

    if supports_req:
        return router.find

    def search_shim(path, req):
        return router.find(path)

    return search_shim
コード例 #4
0
ファイル: api_helpers.py プロジェクト: jmvrbanac/falcon
def prepare_middleware(middleware=None, independent_middleware=False):
    """Check middleware interface and prepare it to iterate.

    Args:
        middleware: list (or object) of input middleware
        independent_middleware: bool whether should prepare request and
            response middleware independently

    Returns:
        list: A tuple of prepared middleware tuples
    """

    # PERF(kgriffs): do getattr calls once, in advance, so we don't
    # have to do them every time in the request path.
    request_mw = []
    resource_mw = []
    response_mw = []

    if middleware is None:
        middleware = []
    else:
        if not isinstance(middleware, list):
            middleware = [middleware]

    for component in middleware:
        process_request = util.get_bound_method(component,
                                                'process_request')
        process_resource = util.get_bound_method(component,
                                                 'process_resource')
        process_response = util.get_bound_method(component,
                                                 'process_response')

        if not (process_request or process_resource or process_response):
            msg = '{0} does not implement the middleware interface'
            raise TypeError(msg.format(component))

        if process_response:
            # NOTE(kgriffs): Shim older implementations to ensure
            # backwards-compatibility.
            args = util.get_argnames(process_response)

            if len(args) == 3:  # (req, resp, resource)
                def let(process_response=process_response):
                    @wraps(process_response)
                    def shim(req, resp, resource, req_succeeded):
                        process_response(req, resp, resource)

                    return shim

                process_response = let()

        # NOTE: depending on whether we want to execute middleware
        # independently, we group response and request middleware either
        # together or separately.
        if independent_middleware:
            if process_request:
                request_mw.append(process_request)
            if process_response:
                response_mw.insert(0, process_response)
        else:
            if process_request or process_response:
                request_mw.append((process_request, process_response))

        if process_resource:
            resource_mw.append(process_resource)

    return (tuple(request_mw), tuple(resource_mw), tuple(response_mw))
コード例 #5
0
ファイル: api_helpers.py プロジェクト: rajib2k5/falcon
def prepare_middleware(middleware=None, independent_middleware=False):
    """Check middleware interface and prepare it to iterate.

    Args:
        middleware: list (or object) of input middleware
        independent_middleware: bool whether should prepare request and
            response middleware independently

    Returns:
        list: A tuple of prepared middleware tuples
    """

    # PERF(kgriffs): do getattr calls once, in advance, so we don't
    # have to do them every time in the request path.
    request_mw = []
    resource_mw = []
    response_mw = []

    if middleware is None:
        middleware = []
    else:
        if not isinstance(middleware, list):
            middleware = [middleware]

    for component in middleware:
        process_request = util.get_bound_method(component,
                                                'process_request')
        process_resource = util.get_bound_method(component,
                                                 'process_resource')
        process_response = util.get_bound_method(component,
                                                 'process_response')

        if not (process_request or process_resource or process_response):
            msg = '{0} does not implement the middleware interface'
            raise TypeError(msg.format(component))

        if process_response:
            # NOTE(kgriffs): Shim older implementations to ensure
            # backwards-compatibility.
            args = util.get_argnames(process_response)

            if len(args) == 3:  # (req, resp, resource)
                def let(process_response=process_response):
                    @wraps(process_response)
                    def shim(req, resp, resource, req_succeeded):
                        process_response(req, resp, resource)

                    return shim

                process_response = let()

        # NOTE: depending on whether we want to execute middleware
        # independently, we group response and request middleware either
        # together or separately.
        if independent_middleware:
            if process_request:
                request_mw.append(process_request)
            if process_response:
                response_mw.insert(0, process_response)
        else:
            if process_request or process_response:
                request_mw.append((process_request, process_response))

        if process_resource:
            resource_mw.append(process_resource)

    return (tuple(request_mw), tuple(resource_mw), tuple(response_mw))