(self, fd: Union[int, ioloop._Selectable], events: int)
| 675 | raise NotImplementedError() |
| 676 | |
| 677 | def _handle_events(self, fd: Union[int, ioloop._Selectable], events: int) -> None: |
| 678 | if self.closed(): |
| 679 | gen_log.warning("Got events for closed stream %s", fd) |
| 680 | return |
| 681 | try: |
| 682 | if self._connecting: |
| 683 | # Most IOLoops will report a write failed connect |
| 684 | # with the WRITE event, but SelectIOLoop reports a |
| 685 | # READ as well so we must check for connecting before |
| 686 | # either. |
| 687 | self._handle_connect() |
| 688 | if self.closed(): |
| 689 | return |
| 690 | if events & self.io_loop.READ: |
| 691 | self._handle_read() |
| 692 | if self.closed(): |
| 693 | return |
| 694 | if events & self.io_loop.WRITE: |
| 695 | self._handle_write() |
| 696 | if self.closed(): |
| 697 | return |
| 698 | if events & self.io_loop.ERROR: |
| 699 | self.error = self.get_fd_error() |
| 700 | # We may have queued up a user callback in _handle_read or |
| 701 | # _handle_write, so don't close the IOStream until those |
| 702 | # callbacks have had a chance to run. |
| 703 | self.io_loop.add_callback(self.close) |
| 704 | return |
| 705 | state = self.io_loop.ERROR |
| 706 | if self.reading(): |
| 707 | state |= self.io_loop.READ |
| 708 | if self.writing(): |
| 709 | state |= self.io_loop.WRITE |
| 710 | if state == self.io_loop.ERROR and self._read_buffer_size == 0: |
| 711 | # If the connection is idle, listen for reads too so |
| 712 | # we can tell if the connection is closed. If there is |
| 713 | # data in the read buffer we won't run the close callback |
| 714 | # yet anyway, so we don't need to listen in this case. |
| 715 | state |= self.io_loop.READ |
| 716 | if state != self._state: |
| 717 | assert ( |
| 718 | self._state is not None |
| 719 | ), "shouldn't happen: _handle_events without self._state" |
| 720 | self._state = state |
| 721 | self.io_loop.update_handler(self.fileno(), self._state) |
| 722 | except UnsatisfiableReadError as e: |
| 723 | gen_log.info("Unsatisfiable read, closing connection: %s" % e) |
| 724 | self.close(exc_info=e) |
| 725 | except Exception as e: |
| 726 | gen_log.error("Uncaught exception, closing connection.", exc_info=True) |
| 727 | self.close(exc_info=e) |
| 728 | raise |
| 729 | |
| 730 | def _read_to_buffer_loop(self) -> Optional[int]: |
| 731 | # This method is called from _handle_read and _try_inline_read. |
nothing calls this directly
no test coverage detected