@@ -180,22 +180,6 @@ async def _do_window_update() -> None:
180
180
async with self .window_lock :
181
181
await _do_window_update ()
182
182
183
- async def read_EOF (self ) -> bytes :
184
- """
185
- To read data from stream until it is closed.
186
- """
187
- data = b""
188
- try :
189
- while True :
190
- recv = await self .read ()
191
- if recv :
192
- data += recv
193
- except MuxedStreamEOF :
194
- logging .debug (
195
- f"Stream { self .stream_id } :EOF reached,total data read:{ len (data )} bytes"
196
- )
197
- return data
198
-
199
183
async def read (self , n : int | None = - 1 ) -> bytes :
200
184
# Handle None value for n by converting it to -1
201
185
if n is None :
@@ -208,25 +192,57 @@ async def read(self, n: int | None = -1) -> bytes:
208
192
)
209
193
raise MuxedStreamEOF ("Stream is closed for receiving" )
210
194
211
- # If reading until EOF (n == -1), block until stream is closed
212
195
if n == - 1 :
213
- # Check if there's data in the buffer
214
- buffer = self .conn .stream_buffers .get (self .stream_id )
215
- size = len (buffer ) if buffer else 0
216
- if size > 0 :
217
- # If any data is available,return it immediately
218
- assert buffer is not None
219
- data = bytes (buffer )
220
- buffer .clear ()
221
- async with self .window_lock :
222
- self .recv_window += len (data )
223
- await self .send_window_update (len (data ), skip_lock = True )
224
- return data
225
- # Otherwise,wait for data or FIN
226
- if self .recv_closed :
227
- raise MuxedStreamEOF ("Stream is closed for receiving" )
228
- await self .conn .stream_events [self .stream_id ].wait ()
229
- self .conn .stream_events [self .stream_id ] = trio .Event ()
196
+ data = b""
197
+ while not self .conn .event_shutting_down .is_set ():
198
+ # Check if there's data in the buffer
199
+ buffer = self .conn .stream_buffers .get (self .stream_id )
200
+
201
+ # If buffer is not available, check if stream is closed
202
+ if buffer is None :
203
+ logging .debug (f"Stream { self .stream_id } : No buffer available" )
204
+ raise MuxedStreamEOF ("Stream buffer closed" )
205
+
206
+ # If we have data in buffer, process it
207
+ if len (buffer ) > 0 :
208
+ chunk = bytes (buffer )
209
+ buffer .clear ()
210
+ data += chunk
211
+
212
+ # Send window update for the chunk we just read
213
+ async with self .window_lock :
214
+ self .recv_window += len (chunk )
215
+ logging .debug (f"Stream { self .stream_id } : Update { len (chunk )} " )
216
+ await self .send_window_update (len (chunk ), skip_lock = True )
217
+
218
+ # If stream is closed (FIN received) and buffer is empty, break
219
+ if self .recv_closed and len (buffer ) == 0 :
220
+ logging .debug (f"Stream { self .stream_id } : Closed with empty buffer" )
221
+ break
222
+
223
+ # If stream was reset, raise reset error
224
+ if self .reset_received :
225
+ logging .debug (f"Stream { self .stream_id } : Stream was reset" )
226
+ raise MuxedStreamReset ("Stream was reset" )
227
+
228
+ # Wait for more data or stream closure
229
+ logging .debug (f"Stream { self .stream_id } : Waiting for data or FIN" )
230
+ await self .conn .stream_events [self .stream_id ].wait ()
231
+ self .conn .stream_events [self .stream_id ] = trio .Event ()
232
+
233
+ # After loop exit, first check if we have data to return
234
+ if data :
235
+ logging .debug (
236
+ f"Stream { self .stream_id } : Returning { len (data )} bytes after loop"
237
+ )
238
+ return data
239
+
240
+ # No data accumulated, now check why we exited the loop
241
+ if self .conn .event_shutting_down .is_set ():
242
+ logging .debug (f"Stream { self .stream_id } : Connection shutting down" )
243
+ raise MuxedStreamEOF ("Connection shut down" )
244
+
245
+ # Return empty data
230
246
return b""
231
247
else :
232
248
data = await self .conn .read_stream (self .stream_id , n )
0 commit comments