def startReading(self, readCallback): """Start reading from the socket. When data becomes available it will be passed to readCallback. If there is already a read callback, it will be replaced. """ if not self.isOpen(): raise ValueError("Socket not connected") self.readCallback = readCallback eventloop.add_read_callback(self.socket, self.onReadReady) self.startReadTimeout()
def handleSocketError(self, code, msg, operation): if code in (socket.SSL_ERROR_WANT_READ, socket.SSL_ERROR_WANT_WRITE): if self.interruptedOperation is None: self.interruptedOperation = operation elif self.interruptedOperation != operation: signals.system.failed("When talking to the network", details="socket error for the wrong SSL operation") self.close_connection() return eventloop.stop_handling_socket(self.socket) if code == socket.SSL_ERROR_WANT_READ: eventloop.add_read_callback(self.socket, self.onReadReady) else: eventloop.add_write_callback(self.socket, self.onWriteReady) elif code in (socket.SSL_ERROR_ZERO_RETURN, socket.SSL_ERROR_SSL, socket.SSL_ERROR_SYSCALL, socket.SSL_ERROR_EOF): self.handleEarlyClose(operation) else: super(AsyncSSLStream, self).handleSocketError(code, msg, operation)
def resumeNormalCallbacks(self): if self.readCallback is not None: eventloop.add_read_callback(self.socket, self.onReadReady) if len(self.toSend) != 0: eventloop.add_write_callback(self.socket, self.onWriteReady)
try: self.socket = socket.socket(family, socket.SOCK_STREAM) self.socket.bind((host, port)) except socket.error, e: trap_call(self, errback, ConnectionError(e[1])) return if self.socket.family == socket.AF_INET: (self.addr, self.port) = self.socket.getsockname() elif self.socket.family == socket.AF_INET6: (self.addr, self.port, self.flowinfo, self.scopeid) = self.socket.getsockname() else: raise ValueError("Unknown socket family: %s", self.socket.family) self.socket.listen(63) eventloop.add_read_callback(self.socket, finishAccept) def close_connection(self): if self.isOpen(): eventloop.stop_handling_socket(self.socket) self.stopReadTimeout() self.socket.close() self.socket = None if self.connectionErrback is not None: error = NetworkError(_("Connection closed")) trap_call(self, self.connectionErrback, error) self.connectionErrback = None def isOpen(self): return self.socket is not None