| 274 | |
| 275 | |
| 276 | class IteratorWrapper: |
| 277 | |
| 278 | def __init__(self, wsgi_iterator, check_start_response): |
| 279 | self.original_iterator = wsgi_iterator |
| 280 | self.iterator = iter(wsgi_iterator) |
| 281 | self.closed = False |
| 282 | self.check_start_response = check_start_response |
| 283 | |
| 284 | def __iter__(self): |
| 285 | return self |
| 286 | |
| 287 | def next(self): |
| 288 | assert not self.closed, ( |
| 289 | "Iterator read after closed") |
| 290 | v = next(self.iterator) |
| 291 | if self.check_start_response is not None: |
| 292 | assert self.check_start_response, ( |
| 293 | "The application returns and we started iterating over its" |
| 294 | " body, but start_response has not yet been called") |
| 295 | self.check_start_response = None |
| 296 | assert isinstance(v, bytes), ( |
| 297 | "Iterator %r returned a non-%r object: %r" |
| 298 | % (self.iterator, bytes, v)) |
| 299 | return v |
| 300 | |
| 301 | __next__ = next |
| 302 | |
| 303 | def close(self): |
| 304 | self.closed = True |
| 305 | if hasattr(self.original_iterator, 'close'): |
| 306 | self.original_iterator.close() |
| 307 | |
| 308 | def __del__(self): |
| 309 | assert self.closed, ( |
| 310 | "Iterator garbage collected without being closed") |
| 311 | |
| 312 | |
| 313 | def check_environ(environ): |
no outgoing calls
searching dependent graphs…