@@ -304,6 +304,38 @@ def recv(self, bufsize):
304
304
305
305
raise BlockingIOError (errno .EAGAIN , "Resource temporarily unavailable" )
306
306
307
+ def recv_into (self , buffer , nbytes = 0 ):
308
+ """
309
+ Receive data from Redis and write it into the provided buffer.
310
+ Returns the number of bytes written.
311
+
312
+ This method is used by the hiredis parser for efficient data reading.
313
+ """
314
+ if self .closed :
315
+ raise ConnectionError ("Socket is closed" )
316
+
317
+ # Use pending responses that were prepared when commands were sent
318
+ if self .pending_responses :
319
+ response = self .pending_responses .pop (0 )
320
+ if b"MOVING" in response :
321
+ self .moving_sent = True
322
+
323
+ # Determine how many bytes to write
324
+ if nbytes == 0 :
325
+ nbytes = len (buffer )
326
+
327
+ # Write data into the buffer (up to nbytes or response length)
328
+ bytes_to_write = min (len (response ), nbytes , len (buffer ))
329
+ buffer [:bytes_to_write ] = response [:bytes_to_write ]
330
+
331
+ return bytes_to_write
332
+ else :
333
+ # No data available - this should block or raise an exception
334
+ # For can_read checks, we should indicate no data is available
335
+ import errno
336
+
337
+ raise BlockingIOError (errno .EAGAIN , "Resource temporarily unavailable" )
338
+
307
339
def fileno (self ):
308
340
"""Return a fake file descriptor for select/poll operations."""
309
341
return 1 # Fake file descriptor
0 commit comments