| 339 | return |
| 340 | |
| 341 | def handle_read(self, watcher, revents, errno=None): |
| 342 | if revents & libev.EV_ERROR: |
| 343 | if errno: |
| 344 | exc = IOError(errno, os.strerror(errno)) |
| 345 | else: |
| 346 | exc = Exception("libev reported an error") |
| 347 | |
| 348 | self.defunct(exc) |
| 349 | return |
| 350 | try: |
| 351 | while True: |
| 352 | buf = self._socket.recv(self.in_buffer_size) |
| 353 | self._iobuf.write(buf) |
| 354 | if len(buf) < self.in_buffer_size: |
| 355 | break |
| 356 | except socket.error as err: |
| 357 | if isinstance(err, ssl.SSLError): |
| 358 | if err.args[0] in (ssl.SSL_ERROR_WANT_READ, ssl.SSL_ERROR_WANT_WRITE): |
| 359 | if not self._iobuf.tell(): |
| 360 | return |
| 361 | else: |
| 362 | self.defunct(err) |
| 363 | return |
| 364 | elif err.args[0] in NONBLOCKING: |
| 365 | if not self._iobuf.tell(): |
| 366 | return |
| 367 | else: |
| 368 | self.defunct(err) |
| 369 | return |
| 370 | |
| 371 | if self._iobuf.tell(): |
| 372 | self.process_io_buffer() |
| 373 | else: |
| 374 | log.debug("Connection %s closed by server", self) |
| 375 | self.close() |
| 376 | |
| 377 | def push(self, data): |
| 378 | sabs = self.out_buffer_size |