| 184 | |
| 185 | |
| 186 | class Body: |
| 187 | def __init__(self, reader): |
| 188 | self.reader = reader |
| 189 | self.buf = io.BytesIO() |
| 190 | |
| 191 | def __iter__(self): |
| 192 | return self |
| 193 | |
| 194 | def __next__(self): |
| 195 | ret = self.readline() |
| 196 | if not ret: |
| 197 | raise StopIteration() |
| 198 | return ret |
| 199 | |
| 200 | next = __next__ |
| 201 | |
| 202 | def getsize(self, size): |
| 203 | if size is None: |
| 204 | return sys.maxsize |
| 205 | elif not isinstance(size, int): |
| 206 | raise TypeError("size must be an integral type") |
| 207 | elif size < 0: |
| 208 | return sys.maxsize |
| 209 | return size |
| 210 | |
| 211 | def read(self, size=None): |
| 212 | size = self.getsize(size) |
| 213 | if size == 0: |
| 214 | return b"" |
| 215 | |
| 216 | if size < self.buf.tell(): |
| 217 | data = self.buf.getvalue() |
| 218 | ret, rest = data[:size], data[size:] |
| 219 | self.buf = io.BytesIO() |
| 220 | self.buf.write(rest) |
| 221 | return ret |
| 222 | |
| 223 | while size > self.buf.tell(): |
| 224 | data = self.reader.read(1024) |
| 225 | if not data: |
| 226 | break |
| 227 | self.buf.write(data) |
| 228 | |
| 229 | data = self.buf.getvalue() |
| 230 | ret, rest = data[:size], data[size:] |
| 231 | self.buf = io.BytesIO() |
| 232 | self.buf.write(rest) |
| 233 | return ret |
| 234 | |
| 235 | def readline(self, size=None): |
| 236 | size = self.getsize(size) |
| 237 | if size == 0: |
| 238 | return b"" |
| 239 | |
| 240 | data = self.buf.getvalue() |
| 241 | self.buf = io.BytesIO() |
| 242 | |
| 243 | ret = [] |
no outgoing calls