Read data from the stream, using buffered data first. Args: size: Number of bytes to read. If None, returns all buffered data or reads a single chunk. Returns: bytes: Data read from buffer or stream
(self, size=None)
| 52 | return end - self._buf_start |
| 53 | |
| 54 | async def read(self, size=None): |
| 55 | """Read data from the stream, using buffered data first. |
| 56 | |
| 57 | Args: |
| 58 | size: Number of bytes to read. If None, returns all buffered |
| 59 | data or reads a single chunk. |
| 60 | |
| 61 | Returns: |
| 62 | bytes: Data read from buffer or stream |
| 63 | """ |
| 64 | if size is not None and not isinstance(size, int): |
| 65 | raise TypeError("size parameter must be an int or long.") |
| 66 | |
| 67 | if size is not None: |
| 68 | if size == 0: |
| 69 | return b"" |
| 70 | if size < 0: |
| 71 | size = None |
| 72 | |
| 73 | buf_size = self._buffer_size() |
| 74 | |
| 75 | # If no size specified, return buffered data or read chunk |
| 76 | if size is None and buf_size > 0: |
| 77 | return self._get_buffered_data() |
| 78 | if size is None: |
| 79 | chunk = await self._read_chunk() |
| 80 | return chunk |
| 81 | |
| 82 | # Read until we have enough data |
| 83 | while buf_size < size: |
| 84 | chunk = await self._read_chunk() |
| 85 | if not chunk: |
| 86 | return self._get_buffered_data() |
| 87 | self.buf.seek(0, io.SEEK_END) |
| 88 | self.buf.write(chunk) |
| 89 | buf_size += len(chunk) |
| 90 | |
| 91 | # We have enough data - extract what we need |
| 92 | self.buf.seek(self._buf_start) |
| 93 | data = self.buf.read(size) |
| 94 | |
| 95 | # Update start position instead of creating new buffer |
| 96 | self._buf_start += size |
| 97 | |
| 98 | # If buffer is getting large with consumed data, compact it |
| 99 | if self._buf_start > 8192: |
| 100 | remaining = self.buf.read() # Read from current position |
| 101 | self._reset_buffer() |
| 102 | if remaining: |
| 103 | self.buf.write(remaining) |
| 104 | |
| 105 | return data |
| 106 | |
| 107 | async def _read_chunk(self): |
| 108 | """Read a chunk of data from the underlying stream.""" |
no test coverage detected