--- Lib/ssl.py.orig 2010-02-16 18:25:37.000000000 +0100 +++ Lib/ssl.py 2010-02-16 18:29:46.000000000 +0100 @@ -67,43 +67,42 @@ 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 -from socket import socket, _fileobject +from socket import socket, _fileobject, _delegate_methods from socket import getnameinfo as _getnameinfo import base64 # for DER-to-PEM translation class SSLSocket (socket): """This class implements a subtype of socket.socket that wraps the underlying OS socket in an SSL context when necessary, and provides read and write methods over that channel.""" def __init__(self, sock, keyfile=None, certfile=None, server_side=False, cert_reqs=CERT_NONE, ssl_version=PROTOCOL_SSLv23, ca_certs=None, do_handshake_on_connect=True, suppress_ragged_eofs=True): socket.__init__(self, _sock=sock._sock) - # the initializer for socket trashes the methods (tsk, tsk), so... - self.send = lambda data, flags=0: SSLSocket.send(self, data, flags) - self.sendto = lambda data, addr, flags=0: SSLSocket.sendto(self, data, addr, flags) - self.recv = lambda buflen=1024, flags=0: SSLSocket.recv(self, buflen, flags) - self.recvfrom = lambda addr, buflen=1024, flags=0: SSLSocket.recvfrom(self, addr, buflen, flags) - self.recv_into = lambda buffer, nbytes=None, flags=0: SSLSocket.recv_into(self, buffer, nbytes, flags) - self.recvfrom_into = lambda buffer, nbytes=None, flags=0: SSLSocket.recvfrom_into(self, buffer, nbytes, flags) + # The initializer for socket overrids the methods send, recv etc. in + # the instancce, which we don't need -- but we want to provide the + # methods defined in SSLSocket. + if self.recv is sock._sock.recv: + for attr in _delegate_methods: + delattr(self, attr) if certfile and not keyfile: keyfile = certfile # see if it's connected try: socket.getpeername(self) except: # no, no connection yet self._sslobj = None else: