[pypy-commit] pypy default: untwist circular imports by adding legacy attributes to socket after import

mattip pypy.commits at gmail.com
Sat May 25 02:08:47 EDT 2019


Author: Matti Picus <matti.picus at gmail.com>
Branch: 
Changeset: r96673:34c2a20bdb33
Date: 2019-05-25 09:07 +0300
http://bitbucket.org/pypy/pypy/changeset/34c2a20bdb33/

Log:	untwist circular imports by adding legacy attributes to socket after
	import

diff --git a/lib-python/2.7/socket.py b/lib-python/2.7/socket.py
--- a/lib-python/2.7/socket.py
+++ b/lib-python/2.7/socket.py
@@ -61,20 +61,22 @@
                       DeprecationWarning, stacklevel=2)
         return _realssl.sslwrap_simple(sock, keyfile, certfile)
 
-    # we need to import the same constants we used to...
-    from _ssl import SSLError as sslerror
-    from _ssl import \
-         RAND_add, \
-         RAND_status, \
-         SSL_ERROR_ZERO_RETURN, \
-         SSL_ERROR_WANT_READ, \
-         SSL_ERROR_WANT_WRITE, \
-         SSL_ERROR_WANT_X509_LOOKUP, \
-         SSL_ERROR_SYSCALL, \
-         SSL_ERROR_SSL, \
-         SSL_ERROR_WANT_CONNECT, \
-         SSL_ERROR_EOF, \
-         SSL_ERROR_INVALID_ERROR_CODE
+    # we need to import the same constants we used to, 
+    # see lib_pypy/_cffi_ssl/_stdssl/error.py and __init__.py to prevent
+    # circular import
+    # from _ssl import SSLError as sslerror
+    # from _ssl import \
+         # RAND_add, \
+         # RAND_status
+         # SSL_ERROR_ZERO_RETURN, \
+         # SSL_ERROR_WANT_READ, \
+         # SSL_ERROR_WANT_WRITE, \
+         # SSL_ERROR_WANT_X509_LOOKUP, \
+         # SSL_ERROR_SYSCALL, \
+         # SSL_ERROR_SSL, \
+         # SSL_ERROR_WANT_CONNECT, \
+         # SSL_ERROR_EOF, \
+         # SSL_ERROR_INVALID_ERROR_CODE
     try:
         from _ssl import RAND_egd
     except ImportError:
diff --git a/lib_pypy/_cffi_ssl/_stdssl/__init__.py b/lib_pypy/_cffi_ssl/_stdssl/__init__.py
--- a/lib_pypy/_cffi_ssl/_stdssl/__init__.py
+++ b/lib_pypy/_cffi_ssl/_stdssl/__init__.py
@@ -20,6 +20,7 @@
         pyerr_write_unraisable)
 from _cffi_ssl._stdssl import error
 from select import select
+import socket
 
 if sys.platform == 'win32':
     from _cffi_ssl._stdssl.win32_extra import enum_certificates, enum_crls
@@ -306,9 +307,6 @@
         return self.socket_type == SSL_SERVER
 
     def do_handshake(self):
-        # delay to prevent circular imports
-        import socket
-
         sock = self.get_socket_or_connection_gone()
         ssl = self.ssl
         timeout = _socket_timeout(sock)
@@ -372,9 +370,6 @@
                 return _decode_certificate(self.peer_cert)
 
     def write(self, bytestring):
-        # delay to prevent circular imports
-        import socket
-
         deadline = 0
         b = _str_to_ffi_buffer(bytestring)
         sock = self.get_socket_or_connection_gone()
@@ -425,9 +420,6 @@
             raise pyssl_error(self, length)
 
     def read(self, length, buffer_into=None):
-        # delay to prevent circular imports
-        import socket
-
         ssl = self.ssl
 
         if length < 0 and buffer_into is None:
@@ -561,9 +553,6 @@
         return sock
 
     def shutdown(self):
-        # delay to prevent circular imports
-        import socket
-
         sock = self.get_socket_or_None()
         nonblocking = False
         ssl = self.ssl
@@ -1545,3 +1534,5 @@
                            "enough data to seed the PRNG");
         return bytecount
 
+socket.RAND_add = RAND_add
+socket.RAND_status = RAND_status
diff --git a/lib_pypy/_cffi_ssl/_stdssl/error.py b/lib_pypy/_cffi_ssl/_stdssl/error.py
--- a/lib_pypy/_cffi_ssl/_stdssl/error.py
+++ b/lib_pypy/_cffi_ssl/_stdssl/error.py
@@ -27,6 +27,13 @@
         if self.strerror and isinstance(self.strerror, str):
             return self.strerror
         return str(self.args)
+# these are expected on socket as well
+socket.sslerror = SSLError
+for v in [ 'SSL_ERROR_ZERO_RETURN', 'SSL_ERROR_WANT_READ',
+     'SSL_ERROR_WANT_WRITE', 'SSL_ERROR_WANT_X509_LOOKUP', 'SSL_ERROR_SYSCALL',
+     'SSL_ERROR_SSL', 'SSL_ERROR_WANT_CONNECT', 'SSL_ERROR_EOF',
+     'SSL_ERROR_INVALID_ERROR_CODE' ]:
+    setattr(socket, v, locals()[v]) 
 
 class SSLZeroReturnError(SSLError):
     """ SSL/TLS session closed cleanly. """


More information about the pypy-commit mailing list