Skip to content

Commit 55d4f16

Browse files
committed
Fix #193 by enabling listener middleware to return a response
1 parent 03fdd85 commit 55d4f16

File tree

12 files changed

+274
-14
lines changed

12 files changed

+274
-14
lines changed

slack_bolt/app/app.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import json
33
import logging
44
import os
5+
import time
56
from concurrent.futures.thread import ThreadPoolExecutor
67
from http.server import SimpleHTTPRequestHandler, HTTPServer
78
from typing import List, Union, Pattern, Callable, Dict, Optional, Sequence
@@ -42,6 +43,7 @@
4243
error_client_invalid_type,
4344
error_authorize_conflicts,
4445
warning_bot_only_conflicts,
46+
debug_return_listener_middleware_response,
4547
)
4648
from slack_bolt.middleware import (
4749
Middleware,
@@ -323,6 +325,7 @@ def dispatch(self, req: BoltRequest) -> BoltResponse:
323325
:param req: An incoming request from Slack.
324326
:return: The response generated by this Bolt app.
325327
"""
328+
starting_time = time.time()
326329
self._init_context(req)
327330

328331
resp: BoltResponse = BoltResponse(status=200, body="")
@@ -348,12 +351,27 @@ def middleware_next():
348351
self._framework_logger.debug(debug_checking_listener(listener_name))
349352
if listener.matches(req=req, resp=resp):
350353
# run all the middleware attached to this listener first
351-
resp, next_was_not_called = listener.run_middleware(req=req, resp=resp)
354+
middleware_resp, next_was_not_called = listener.run_middleware(
355+
req=req, resp=resp
356+
)
352357
if next_was_not_called:
358+
if middleware_resp is not None:
359+
if self._framework_logger.level <= logging.DEBUG:
360+
debug_message = debug_return_listener_middleware_response(
361+
listener_name,
362+
middleware_resp.status,
363+
middleware_resp.body,
364+
starting_time,
365+
)
366+
self._framework_logger.debug(debug_message)
367+
return middleware_resp
353368
# The last listener middleware didn't call next() method.
354369
# This means the listener is not for this incoming request.
355370
continue
356371

372+
if middleware_resp is not None:
373+
resp = middleware_resp
374+
357375
self._framework_logger.debug(debug_running_listener(listener_name))
358376
listener_response: Optional[BoltResponse] = self._listener_runner.run(
359377
request=req,

slack_bolt/app/async_app.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import inspect
22
import logging
33
import os
4+
import time
45
from typing import Optional, List, Union, Callable, Pattern, Dict, Awaitable, Sequence
56

67
from aiohttp import web
@@ -39,6 +40,7 @@
3940
error_oauth_settings_invalid_type_async,
4041
error_oauth_flow_invalid_type_async,
4142
warning_bot_only_conflicts,
43+
debug_return_listener_middleware_response,
4244
)
4345
from slack_bolt.lazy_listener.asyncio_runner import AsyncioLazyListenerRunner
4446
from slack_bolt.listener.async_listener import AsyncListener, AsyncCustomListener
@@ -359,6 +361,7 @@ async def async_dispatch(self, req: AsyncBoltRequest) -> BoltResponse:
359361
:param req: An incoming request from Slack.
360362
:return: The response generated by this Bolt app.
361363
"""
364+
starting_time = time.time()
362365
self._init_context(req)
363366

364367
resp: BoltResponse = BoltResponse(status=200, body="")
@@ -386,14 +389,28 @@ async def async_middleware_next():
386389
self._framework_logger.debug(debug_checking_listener(listener_name))
387390
if await listener.async_matches(req=req, resp=resp):
388391
# run all the middleware attached to this listener first
389-
resp, next_was_not_called = await listener.run_async_middleware(
390-
req=req, resp=resp
391-
)
392+
(
393+
middleware_resp,
394+
next_was_not_called,
395+
) = await listener.run_async_middleware(req=req, resp=resp)
392396
if next_was_not_called:
397+
if middleware_resp is not None:
398+
if self._framework_logger.level <= logging.DEBUG:
399+
debug_message = debug_return_listener_middleware_response(
400+
listener_name,
401+
middleware_resp.status,
402+
middleware_resp.body,
403+
starting_time,
404+
)
405+
self._framework_logger.debug(debug_message)
406+
return middleware_resp
393407
# The last listener middleware didn't call next() method.
394408
# This means the listener is not for this incoming request.
395409
continue
396410

411+
if middleware_resp is not None:
412+
resp = middleware_resp
413+
397414
self._framework_logger.debug(debug_running_listener(listener_name))
398415
listener_response: Optional[
399416
BoltResponse

slack_bolt/listener/async_listener.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ async def run_async_middleware(
3333
*,
3434
req: AsyncBoltRequest,
3535
resp: BoltResponse,
36-
) -> Tuple[BoltResponse, bool]:
36+
) -> Tuple[Optional[BoltResponse], bool]:
3737
"""Runs an async middleware.
3838
3939
:param req: The incoming request

slack_bolt/listener/asyncio_runner.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,10 @@ async def run(
4242
response: BoltResponse,
4343
listener_name: str,
4444
listener: AsyncListener,
45+
starting_time: Optional[float] = None,
4546
) -> Optional[BoltResponse]:
4647
ack = request.context.ack
47-
starting_time = time.time()
48+
starting_time = starting_time if starting_time is not None else time.time()
4849
if self.process_before_response:
4950
if not request.lazy_only:
5051
try:

slack_bolt/listener/listener.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from abc import abstractmethod, ABCMeta
2-
from typing import Callable, Tuple, Sequence
2+
from typing import Callable, Tuple, Sequence, Optional
33

44
from slack_bolt.listener_matcher import ListenerMatcher
55
from slack_bolt.middleware import Middleware
@@ -32,7 +32,7 @@ def run_middleware(
3232
*,
3333
req: BoltRequest,
3434
resp: BoltResponse,
35-
) -> Tuple[BoltResponse, bool]:
35+
) -> Tuple[Optional[BoltResponse], bool]:
3636
"""
3737
3838
:param req: the incoming request

slack_bolt/listener/thread_runner.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,10 @@ def run( # type: ignore
4343
response: BoltResponse,
4444
listener_name: str,
4545
listener: Listener,
46+
starting_time: Optional[float] = None,
4647
) -> Optional[BoltResponse]:
4748
ack = request.context.ack
48-
starting_time = time.time()
49+
starting_time = starting_time if starting_time is not None else time.time()
4950
if self.process_before_response:
5051
if not request.lazy_only:
5152
try:

slack_bolt/logger/messages.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import time
12
from typing import Union
23

34
from slack_sdk.web import SlackResponse
@@ -111,3 +112,10 @@ def debug_running_lazy_listener(func_name: str) -> str:
111112

112113
def debug_responding(status: int, body: str, millis: int) -> str:
113114
return f'Responding with status: {status} body: "{body}" ({millis} millis)'
115+
116+
117+
def debug_return_listener_middleware_response(
118+
listener_name: str, status: int, body: str, starting_time: float
119+
) -> str:
120+
millis = int((time.time() - starting_time) * 1000)
121+
return f"Responding with listener middleware's response - listener: {listener_name}, status: {status}, body: {body} ({millis} millis)"

slack_bolt/middleware/async_middleware.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from abc import ABCMeta, abstractmethod
2-
from typing import Callable, Awaitable
2+
from typing import Callable, Awaitable, Optional
33

44
from slack_bolt.request.async_request import AsyncBoltRequest
55
from slack_bolt.response import BoltResponse
@@ -13,7 +13,7 @@ async def async_process(
1313
req: AsyncBoltRequest,
1414
resp: BoltResponse,
1515
next: Callable[[], Awaitable[BoltResponse]],
16-
) -> BoltResponse:
16+
) -> Optional[BoltResponse]:
1717
raise NotImplementedError()
1818

1919
@property

slack_bolt/middleware/middleware.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from abc import ABCMeta, abstractmethod
2-
from typing import Callable
2+
from typing import Callable, Optional
33

44
from slack_bolt.request import BoltRequest
55
from slack_bolt.response import BoltResponse
@@ -13,7 +13,7 @@ def process(
1313
req: BoltRequest,
1414
resp: BoltResponse,
1515
next: Callable[[], BoltResponse],
16-
) -> BoltResponse:
16+
) -> Optional[BoltResponse]:
1717
raise NotImplementedError()
1818

1919
@property

slack_bolt/workflows/step/step_middleware.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def process(
1919
req: BoltRequest,
2020
resp: BoltResponse,
2121
next: Callable[[], BoltResponse],
22-
) -> BoltResponse:
22+
) -> Optional[BoltResponse]:
2323

2424
if self.step.edit.matches(req=req, resp=resp):
2525
resp = self._run(self.step.edit, req, resp)

0 commit comments

Comments
 (0)