diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2011-02-26 23:35:27 +0000 |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2011-02-26 23:35:27 +0000 |
commit | d3f6ea1d1e53f5ff35ebd149ddc57a1a0cb5e543 (patch) | |
tree | 5113433df1f0c506947446143bbf2eebe6a7cecc /Lib/ssl.py | |
parent | 8059e1e2140d08683429a6731ecf4b1d2385cce3 (diff) | |
download | cpython-git-d3f6ea1d1e53f5ff35ebd149ddc57a1a0cb5e543.tar.gz |
Merged revisions 88664 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r88664 | antoine.pitrou | 2011-02-27 00:24:06 +0100 (dim., 27 févr. 2011) | 4 lines
Issue #11326: Add the missing connect_ex() implementation for SSL sockets,
and make it work for non-blocking connects.
........
Diffstat (limited to 'Lib/ssl.py')
-rw-r--r-- | Lib/ssl.py | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/Lib/ssl.py b/Lib/ssl.py index 8c2cdf1bb4..72fbae57ff 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -110,9 +110,11 @@ class SSLSocket(socket): if e.errno != errno.ENOTCONN: raise # no, no connection yet + self._connected = False self._sslobj = None else: # yes, create the SSL object + self._connected = True self._sslobj = _ssl.sslwrap(self._sock, server_side, keyfile, certfile, cert_reqs, ssl_version, ca_certs, @@ -282,21 +284,36 @@ class SSLSocket(socket): self._sslobj.do_handshake() - def connect(self, addr): - - """Connects to remote ADDR, and then wraps the connection in - an SSL channel.""" - + def _real_connect(self, addr, return_errno): # Here we assume that the socket is client-side, and not # connected at the time of the call. We connect it, then wrap it. - if self._sslobj: + if self._connected: raise ValueError("attempt to connect already-connected SSLSocket!") - socket.connect(self, addr) self._sslobj = _ssl.sslwrap(self._sock, False, self.keyfile, self.certfile, self.cert_reqs, self.ssl_version, self.ca_certs, self.ciphers) - if self.do_handshake_on_connect: - self.do_handshake() + try: + socket.connect(self, addr) + if self.do_handshake_on_connect: + self.do_handshake() + except socket_error as e: + if return_errno: + return e.errno + else: + self._sslobj = None + raise e + self._connected = True + return 0 + + def connect(self, addr): + """Connects to remote ADDR, and then wraps the connection in + an SSL channel.""" + self._real_connect(addr, False) + + def connect_ex(self, addr): + """Connects to remote ADDR, and then wraps the connection in + an SSL channel.""" + return self._real_connect(addr, True) def accept(self): |