async def async_dispatch(self, req: AsyncBoltRequest) -> BoltResponse: """Applies all middleware and dispatches an incoming request from Slack to the right code path. :param req: An incoming request from Slack. :return: The response generated by this Bolt app. """ self._init_context(req) resp: BoltResponse = BoltResponse(status=200, body="") middleware_state = {"next_called": False} async def async_middleware_next(): middleware_state["next_called"] = True for middleware in self._async_middleware_list: middleware_state["next_called"] = False if self._framework_logger.level <= logging.DEBUG: self._framework_logger.debug(f"Applying {middleware.name}") resp = await middleware.async_process(req=req, resp=resp, next=async_middleware_next) if not middleware_state["next_called"]: if resp is None: return BoltResponse( status=404, body={"error": "no next() calls in middleware"}) return resp for listener in self._async_listeners: listener_name = listener.ack_function.__name__ self._framework_logger.debug( debug_checking_listener(listener_name)) if await listener.async_matches(req=req, resp=resp): # run all the middleware attached to this listener first resp, next_was_not_called = await listener.run_async_middleware( req=req, resp=resp) if next_was_not_called: # The last listener middleware didn't call next() method. # This means the listener is not for this incoming request. continue self._framework_logger.debug( debug_running_listener(listener_name)) listener_response: Optional[ BoltResponse] = await self._async_listener_runner.run( request=req, response=resp, listener_name=listener_name, listener=listener, ) if listener_response is not None: return listener_response self._framework_logger.warning(warning_unhandled_request(req)) return BoltResponse(status=404, body={"error": "unhandled request"})
def dispatch(self, req: BoltRequest) -> BoltResponse: """Applies all middleware and dispatches an incoming request from Slack to the right code path. :param req: An incoming request from Slack. :return: The response generated by this Bolt app. """ starting_time = time.time() self._init_context(req) resp: BoltResponse = BoltResponse(status=200, body="") middleware_state = {"next_called": False} def middleware_next(): middleware_state["next_called"] = True for middleware in self._middleware_list: middleware_state["next_called"] = False if self._framework_logger.level <= logging.DEBUG: self._framework_logger.debug( debug_applying_middleware(middleware.name)) resp = middleware.process(req=req, resp=resp, next=middleware_next) if not middleware_state["next_called"]: if resp is None: return BoltResponse( status=404, body={"error": "no next() calls in middleware"}) return resp for listener in self._listeners: listener_name = get_name_for_callable(listener.ack_function) self._framework_logger.debug( debug_checking_listener(listener_name)) if listener.matches(req=req, resp=resp): # run all the middleware attached to this listener first middleware_resp, next_was_not_called = listener.run_middleware( req=req, resp=resp) if next_was_not_called: if middleware_resp is not None: if self._framework_logger.level <= logging.DEBUG: debug_message = debug_return_listener_middleware_response( listener_name, middleware_resp.status, middleware_resp.body, starting_time, ) self._framework_logger.debug(debug_message) return middleware_resp # The last listener middleware didn't call next() method. # This means the listener is not for this incoming request. continue if middleware_resp is not None: resp = middleware_resp self._framework_logger.debug( debug_running_listener(listener_name)) listener_response: Optional[ BoltResponse] = self._listener_runner.run( request=req, response=resp, listener_name=listener_name, listener=listener, ) if listener_response is not None: return listener_response self._framework_logger.warning(warning_unhandled_request(req)) return BoltResponse(status=404, body={"error": "unhandled request"})