@@ -79,7 +79,12 @@ def get_next_frame(self, timeout: float | None = None) -> Frame:
79
79
raise EOFError ("stream of frames ended" ) from None
80
80
else :
81
81
try :
82
- frame = self .frames .get (block = True , timeout = timeout )
82
+ # Check for a frame that's already received if timeout <= 0.
83
+ # SimpleQueue.get() doesn't support negative timeout values.
84
+ if timeout is not None and timeout <= 0 :
85
+ frame = self .frames .get (block = False )
86
+ else :
87
+ frame = self .frames .get (block = True , timeout = timeout )
83
88
except queue .Empty :
84
89
raise TimeoutError (f"timed out in { timeout :.1f} s" ) from None
85
90
if frame is None :
@@ -143,7 +148,7 @@ def get(self, timeout: float | None = None, decode: bool | None = None) -> Data:
143
148
deadline = Deadline (timeout )
144
149
145
150
# First frame
146
- frame = self .get_next_frame (deadline .timeout ())
151
+ frame = self .get_next_frame (deadline .timeout (raise_if_elapsed = False ))
147
152
with self .mutex :
148
153
self .maybe_resume ()
149
154
assert frame .opcode is OP_TEXT or frame .opcode is OP_BINARY
@@ -154,7 +159,7 @@ def get(self, timeout: float | None = None, decode: bool | None = None) -> Data:
154
159
# Following frames, for fragmented messages
155
160
while not frame .fin :
156
161
try :
157
- frame = self .get_next_frame (deadline .timeout ())
162
+ frame = self .get_next_frame (deadline .timeout (raise_if_elapsed = False ))
158
163
except TimeoutError :
159
164
# Put frames already received back into the queue
160
165
# so that future calls to get() can return them.
0 commit comments