Skip to content

Commit 0554d46

Browse files
authored
Fix #1230 "unpack requires a buffer of 2 bytes" error when we have many options / option groups (#1232)
1 parent 7fe4e92 commit 0554d46

File tree

3 files changed

+18
-3
lines changed

3 files changed

+18
-3
lines changed

slack_sdk/socket_mode/builtin/internals.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ def _fetch_messages(
278278
elif current_data_length == 127:
279279
if len(remaining_bytes) < 10:
280280
remaining_bytes += receive(1024)
281-
current_data_length = struct.unpack("!H", bytes(remaining_bytes[2:10]))[0]
281+
current_data_length = struct.unpack("!Q", bytes(remaining_bytes[2:10]))[0]
282282
idx_after_length_part = 10
283283

284284
current_header = FrameHeader(

tests/slack_sdk/socket_mode/mock_socket_mode_server.py

Lines changed: 3 additions & 2 deletions
Large diffs are not rendered by default.

tests/slack_sdk/socket_mode/test_interactions_builtin.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
cleanup_mock_web_api_server,
2323
)
2424

25+
import sys
26+
2527

2628
class TestInteractionsBuiltin(unittest.TestCase):
2729
logger = logging.getLogger(__name__)
@@ -46,6 +48,16 @@ def test_buffer_size_validation(self):
4648
def test_interactions(self):
4749
if is_ci_unstable_test_skip_enabled():
4850
return
51+
52+
default_recursion_limit = sys.getrecursionlimit() # will restore later
53+
# This built-in WebSocket client internally has recursive method calls of _fetch_messages method.
54+
# In this test, the method calls can result in the following error when giving a quite small buffer size.
55+
# RecursionError: maximum recursion depth exceeded while calling a Python object
56+
# (the default recursion depth in Python is 1500)
57+
# Since the default buffer size is set to 1024, and it's enough to prevent the same situation happening,
58+
# we believe that the same situation never happens in the production usage.
59+
sys.setrecursionlimit(4000)
60+
4961
t = Thread(target=start_socket_mode_server(self, 3011))
5062
t.daemon = True
5163
t.start()
@@ -112,6 +124,8 @@ def socket_mode_request_handler(client: BaseSocketModeClient, request: SocketMod
112124
self.logger.info(f"Passed with buffer size: {buffer_size}")
113125

114126
finally:
127+
# Restore the default value
128+
sys.setrecursionlimit(default_recursion_limit)
115129
client.close()
116130
self.server.stop()
117131
self.server.close()

0 commit comments

Comments
 (0)