]> granicus.if.org Git - python/commitdiff
Issue #12065: connect_ex() on an SSL socket now returns the original errno
authorAntoine Pitrou <solipsis@pitrou.net>
Wed, 18 May 2011 16:51:06 +0000 (18:51 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Wed, 18 May 2011 16:51:06 +0000 (18:51 +0200)
when the socket's timeout expires (it used to return None).

Lib/ssl.py
Lib/test/test_ssl.py
Misc/NEWS

index b12b9fd1e6497b9f1e5ddf788432e170b85a3802..e9e9aa8db0455ab623f840a4a002cf3329a7df9c 100644 (file)
@@ -442,7 +442,7 @@ class SSLSocket(socket):
         finally:
             self.settimeout(timeout)
 
-    def _real_connect(self, addr, return_errno):
+    def _real_connect(self, addr, connect_ex):
         if self.server_side:
             raise ValueError("can't connect in server-side mode")
         # Here we assume that the socket is client-side, and not
@@ -451,17 +451,19 @@ class SSLSocket(socket):
             raise ValueError("attempt to connect already-connected SSLSocket!")
         self._sslobj = self.context._wrap_socket(self, False, self.server_hostname)
         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
+            if connect_ex:
+                rc = socket.connect_ex(self, addr)
             else:
-                self._sslobj = None
-                raise e
-        self._connected = True
-        return 0
+                rc = None
+                socket.connect(self, addr)
+            if not rc:
+                if self.do_handshake_on_connect:
+                    self.do_handshake()
+                self._connected = True
+            return rc
+        except socket_error:
+            self._sslobj = None
+            raise
 
     def connect(self, addr):
         """Connects to remote ADDR, and then wraps the connection in
index f65aceb057b9f67f2a3865580fde846490149048..7edf5b2991bbf20ca4eeb5ce0fbf898090fda554 100644 (file)
@@ -519,6 +519,23 @@ class NetworkedTests(unittest.TestCase):
             finally:
                 s.close()
 
+    def test_timeout_connect_ex(self):
+        # Issue #12065: on a timeout, connect_ex() should return the original
+        # errno (mimicking the behaviour of non-SSL sockets).
+        with support.transient_internet("svn.python.org"):
+            s = ssl.wrap_socket(socket.socket(socket.AF_INET),
+                                cert_reqs=ssl.CERT_REQUIRED,
+                                ca_certs=SVN_PYTHON_ORG_ROOT_CERT,
+                                do_handshake_on_connect=False)
+            try:
+                s.settimeout(0.0000001)
+                rc = s.connect_ex(('svn.python.org', 443))
+                if rc == 0:
+                    self.skipTest("svn.python.org responded too quickly")
+                self.assertIn(rc, (errno.EAGAIN, errno.EWOULDBLOCK))
+            finally:
+                s.close()
+
     def test_connect_with_context(self):
         with support.transient_internet("svn.python.org"):
             # Same as test_connect, but with a separately created context
index eae29528ab31e4c5aeedc07a6049ad8bf5f4605d..d7d4cbd45aec05069ea30d6f869ae0f78750bd67 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -2,6 +2,21 @@
 Python News
 +++++++++++
 
+What's New in Python 3.2.2?
+===========================
+
+*Release date: XX-XXX-2011*
+
+Core and Builtins
+-----------------
+
+Library
+-------
+
+- Issue #12065: connect_ex() on an SSL socket now returns the original errno
+  when the socket's timeout expires (it used to return None).
+
+
 What's New in Python 3.2.1 release candidate 1?
 ===============================================