Skip to content

Commit 6317c00

Browse files
mattyoungbergaaugustin
authored andcommitted
Clarify behavior of recv(timeout=0) behavior.
Refs #1552.
1 parent b1e88fc commit 6317c00

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

src/websockets/sync/connection.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -232,9 +232,10 @@ def recv(self, timeout: float | None = None, decode: bool | None = None) -> Data
232232
message stream.
233233
234234
If ``timeout`` is :obj:`None`, block until a message is received. If
235-
``timeout`` is set and no message is received within ``timeout``
236-
seconds, raise :exc:`TimeoutError`. Set ``timeout`` to ``0`` to check if
237-
a message was already received.
235+
``timeout`` is set, wait up to ``timeout`` seconds for a message to be
236+
received and return it, else raise :exc:`TimeoutError`. If ``timeout``
237+
is ``0`` or negative, check if a message has been received already and
238+
return it, else raise :exc:`TimeoutError`.
238239
239240
If the message is fragmented, wait until all fragments are received,
240241
reassemble them, and return the whole message.

tests/sync/test_messages.py

+22-2
Original file line numberDiff line numberDiff line change
@@ -198,12 +198,32 @@ def test_get_timeout_after_first_frame(self):
198198
message = self.assembler.get()
199199
self.assertEqual(message, "café")
200200

201-
def test_get_if_received(self):
202-
"""get returns a text message if it's already received."""
201+
def test_get_timeout_0_message_already_received(self):
202+
"""get(timeout=0) returns a message that is already received."""
203203
self.assembler.put(Frame(OP_TEXT, b"caf\xc3\xa9"))
204204
message = self.assembler.get(timeout=0)
205205
self.assertEqual(message, "café")
206206

207+
def test_get_timeout_0_message_not_received_yet(self):
208+
"""get(timeout=0) times out when no message is already received."""
209+
with self.assertRaises(TimeoutError):
210+
self.assembler.get(timeout=0)
211+
212+
def test_get_timeout_0_fragmented_message_already_received(self):
213+
"""get(timeout=0) returns a fragmented message that is already received."""
214+
self.assembler.put(Frame(OP_TEXT, b"ca", fin=False))
215+
self.assembler.put(Frame(OP_CONT, b"f\xc3", fin=False))
216+
self.assembler.put(Frame(OP_CONT, b"\xa9"))
217+
message = self.assembler.get(timeout=0)
218+
self.assertEqual(message, "café")
219+
220+
def test_get_timeout_0_fragmented_message_partially_received(self):
221+
"""get(timeout=0) times out when a fragmented message is partially received."""
222+
self.assembler.put(Frame(OP_TEXT, b"ca", fin=False))
223+
self.assembler.put(Frame(OP_CONT, b"f\xc3", fin=False))
224+
with self.assertRaises(TimeoutError):
225+
self.assembler.get(timeout=0)
226+
207227
# Test get_iter
208228

209229
def test_get_iter_text_message_already_received(self):

0 commit comments

Comments
 (0)