(self)
| 606 | self._signal_closed() |
| 607 | |
| 608 | def _signal_closed(self) -> None: |
| 609 | futures = [] # type: List[Future] |
| 610 | if self._read_future is not None: |
| 611 | futures.append(self._read_future) |
| 612 | self._read_future = None |
| 613 | futures += [future for _, future in self._write_futures] |
| 614 | self._write_futures.clear() |
| 615 | if self._connect_future is not None: |
| 616 | futures.append(self._connect_future) |
| 617 | self._connect_future = None |
| 618 | for future in futures: |
| 619 | if not future.done(): |
| 620 | future.set_exception(StreamClosedError(real_error=self.error)) |
| 621 | # Reference the exception to silence warnings. Annoyingly, |
| 622 | # this raises if the future was cancelled, but just |
| 623 | # returns any other error. |
| 624 | try: |
| 625 | future.exception() |
| 626 | except asyncio.CancelledError: |
| 627 | pass |
| 628 | if self._ssl_connect_future is not None: |
| 629 | # _ssl_connect_future expects to see the real exception (typically |
| 630 | # an ssl.SSLError), not just StreamClosedError. |
| 631 | if not self._ssl_connect_future.done(): |
| 632 | if self.error is not None: |
| 633 | self._ssl_connect_future.set_exception(self.error) |
| 634 | else: |
| 635 | self._ssl_connect_future.set_exception(StreamClosedError()) |
| 636 | self._ssl_connect_future.exception() |
| 637 | self._ssl_connect_future = None |
| 638 | if self._close_callback is not None: |
| 639 | cb = self._close_callback |
| 640 | self._close_callback = None |
| 641 | self.io_loop.add_callback(cb) |
| 642 | # Clear the buffers so they can be cleared immediately even |
| 643 | # if the IOStream object is kept alive by a reference cycle. |
| 644 | # TODO: Clear the read buffer too; it currently breaks some tests. |
| 645 | self._write_buffer = None # type: ignore |
| 646 | |
| 647 | def reading(self) -> bool: |
| 648 | """Returns ``True`` if we are currently reading from the stream.""" |
no test coverage detected