| 152 | self.finished = False |
| 153 | |
| 154 | def read(self, size): |
| 155 | if not isinstance(size, int): |
| 156 | raise TypeError("size must be an integral type") |
| 157 | if size < 0: |
| 158 | raise ValueError("Size must be positive.") |
| 159 | if size == 0: |
| 160 | return b"" |
| 161 | |
| 162 | if self.finished: |
| 163 | data = self.buf.getvalue() |
| 164 | ret, rest = data[:size], data[size:] |
| 165 | self.buf = io.BytesIO() |
| 166 | self.buf.write(rest) |
| 167 | return ret |
| 168 | |
| 169 | data = self.unreader.read() |
| 170 | while data: |
| 171 | self.buf.write(data) |
| 172 | if self.buf.tell() > size: |
| 173 | break |
| 174 | data = self.unreader.read() |
| 175 | |
| 176 | if not data: |
| 177 | self.finished = True |
| 178 | |
| 179 | data = self.buf.getvalue() |
| 180 | ret, rest = data[:size], data[size:] |
| 181 | self.buf = io.BytesIO() |
| 182 | self.buf.write(rest) |
| 183 | return ret |
| 184 | |
| 185 | |
| 186 | class Body: |