MCPcopy
hub / github.com/benoitc/gunicorn / read

Method read

gunicorn/asgi/unreader.py:54–105  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

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."""

Callers 6

_async_read_exactMethod · 0.45
read_bodyMethod · 0.45
_get_buffered_dataMethod · 0.45
_read_chunkMethod · 0.45
unreadMethod · 0.45
has_logging_configFunction · 0.45

Calls 6

_buffer_sizeMethod · 0.95
_get_buffered_dataMethod · 0.95
_read_chunkMethod · 0.95
_reset_bufferMethod · 0.95
seekMethod · 0.80
writeMethod · 0.45

Tested by

no test coverage detected