Add python-eventlet package to MOS 8.0 repository
[packages/trusty/python-eventlet.git] / python-eventlet / eventlet / green / ssl.py
similarity index 95%
rename from eventlet/eventlet/green/ssl.py
rename to python-eventlet/eventlet/green/ssl.py
index 963fbdb265af85483f7ff2bdcebc9a4bd98da866..ded65338c8d59bad2c7d26b7be9f21b3c81d979d 100644 (file)
@@ -3,6 +3,7 @@ __ssl = __import__('ssl')
 from eventlet.patcher import slurp_properties
 slurp_properties(__ssl, globals(), srckeys=dir(__ssl))
 
+import functools
 import sys
 import errno
 time = __import__('time')
@@ -162,11 +163,14 @@ class GreenSSLSocket(_original_sslsocket):
                     self.__class__)
             amount = len(data)
             count = 0
+            data_to_send = data
             while (count < amount):
-                v = self.send(data[count:])
+                v = self.send(data_to_send)
                 count += v
                 if v == 0:
                     trampoline(self, write=True, timeout_exc=timeout_exc('timed out'))
+                else:
+                    data_to_send = data[count:]
             return amount
         else:
             while True:
@@ -342,7 +346,7 @@ def wrap_socket(sock, *a, **kw):
 if hasattr(__ssl, 'sslwrap_simple'):
     def sslwrap_simple(sock, keyfile=None, certfile=None):
         """A replacement for the old socket.ssl function.  Designed
-        for compability with Python 2.5 and earlier.  Will disappear in
+        for compatibility with Python 2.5 and earlier.  Will disappear in
         Python 3.0."""
         ssl_sock = GreenSSLSocket(sock, keyfile=keyfile, certfile=certfile,
                                   server_side=False,
@@ -350,3 +354,14 @@ if hasattr(__ssl, 'sslwrap_simple'):
                                   ssl_version=PROTOCOL_SSLv23,
                                   ca_certs=None)
         return ssl_sock
+
+
+if hasattr(__ssl, 'SSLContext'):
+    @functools.wraps(__ssl.SSLContext.wrap_socket)
+    def _green_sslcontext_wrap_socket(self, sock, *a, **kw):
+        return GreenSSLSocket(sock, *a, _context=self, **kw)
+
+    # FIXME:
+    # * GreenSSLContext akin to GreenSSLSocket
+    # * make ssl.create_default_context() use modified SSLContext from globals as usual
+    __ssl.SSLContext.wrap_socket = _green_sslcontext_wrap_socket