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
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
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
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))
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))