]> granicus.if.org Git - python/commitdiff
Hopefully fix sporadic Windows issue by avoiding calling getpeername()
authorAntoine Pitrou <solipsis@pitrou.net>
Mon, 26 Apr 2010 22:17:47 +0000 (22:17 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Mon, 26 Apr 2010 22:17:47 +0000 (22:17 +0000)
on a freshly dup'ed socket.

Lib/ssl.py

index 8ab32549955e87ec419fc1fa84c41123201ab949..ba3f09167fed45eaa295d810bce856c0d5b47e5a 100644 (file)
@@ -83,6 +83,7 @@ from socket import socket, AF_INET, SOCK_STREAM
 import base64        # for DER-to-PEM translation
 import traceback
 import errno
+import time
 
 class SSLSocket(socket):
 
@@ -97,6 +98,7 @@ class SSLSocket(socket):
                  family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None,
                  suppress_ragged_eofs=True, ciphers=None):
 
+        connected = False
         if sock is not None:
             socket.__init__(self,
                             family=sock.family,
@@ -104,26 +106,27 @@ class SSLSocket(socket):
                             proto=sock.proto,
                             fileno=_dup(sock.fileno()))
             self.settimeout(sock.gettimeout())
+            # see if it's connected
+            try:
+                sock.getpeername()
+            except socket_error as e:
+                if e.errno != errno.ENOTCONN:
+                    raise
+            else:
+                connected = True
             sock.close()
         elif fileno is not None:
             socket.__init__(self, fileno=fileno)
         else:
             socket.__init__(self, family=family, type=type, proto=proto)
 
-        self._closed = False
-
         if certfile and not keyfile:
             keyfile = certfile
-        # see if it's connected
-        try:
-            socket.getpeername(self)
-        except socket_error as e:
-            if e.errno != errno.ENOTCONN:
-                raise
-            # no, no connection yet
-            self._sslobj = None
-        else:
-            # yes, create the SSL object
+
+        self._closed = False
+        self._sslobj = None
+        if connected:
+            # create the SSL object
             try:
                 self._sslobj = _ssl.sslwrap(self, server_side,
                                             keyfile, certfile,