def _connect(self): ''' Connect first available epnt ''' sock = utils_net.connect(self.epnts.popleft(), self.prefer_ipv6) if sock: self.sock = sock self.timestamp = utils.ticks() POLLER.set_writable(self) else: self._connection_failed()
def handle_read(self): # # Deal with the case where recv() is blocked by send(), that happens # when we are using SSL and write() returned WANT_READ. In the common # case, this costs just one extra if in the fast path. # if self.recv_blocked: logging.debug('stream: handle_read() => handle_write()') POLLER.set_writable(self) if self.recv_bytes <= 0: POLLER.unset_readable(self) self.recv_blocked = False self.handle_write() return status, octets = self.sock.sorecv(self.recv_bytes) # # Optimisation: reorder if branches such that the ones more relevant # for better performance come first. Testing in early 2011 showed that # this arrangement allows to gain a little more speed. (And the code # is still readable.) # if status == SUCCESS and octets: self.bytes_in += len(octets) self.recv_bytes = 0 POLLER.unset_readable(self) self.recv_complete(self, octets) return if status == WANT_READ: return if status == WANT_WRITE: logging.debug('stream: blocking send()') POLLER.unset_readable(self) POLLER.set_writable(self) self.send_blocked = True return if status == SUCCESS and not octets: logging.debug('stream: EOF') self.eof = True POLLER.close(self) return if status == CONNRST and not octets: logging.debug('stream: RST ') self.conn_rst = True POLLER.close(self) return raise RuntimeError('stream: invalid status')
def send(self, send_octets, send_complete): ''' Async send() ''' if self.isclosed: raise RuntimeError('stream: send() on a closed stream') if self.send_octets: raise RuntimeError('stream: already send()ing') self.send_octets = send_octets self.send_complete = send_complete if self.send_blocked: logging.debug('stream: send() is blocked') return POLLER.set_writable(self)
def handshake(self): ''' Async SSL handshake ''' try: self.opaque.sock.sock.do_handshake() except ssl.SSLError: exception = sys.exc_info()[1] if exception.args[0] == ssl.SSL_ERROR_WANT_READ: POLLER.set_readable(self) elif exception.args[0] == ssl.SSL_ERROR_WANT_WRITE: POLLER.set_writable(self) else: raise else: stream = self.opaque self.opaque = None stream.atconnect.callback(stream)