diff -urN M2Crypto/M2Crypto/httpslib.py M2Crypto-0.21.1/M2Crypto/httpslib.py --- M2Crypto/M2Crypto/httpslib.py 2011-01-15 20:10:05.000000000 +0100 +++ M2Crypto-0.21.1/M2Crypto/httpslib.py 2012-03-13 15:04:13.848836581 +0100 @@ -44,10 +44,33 @@ HTTPConnection.__init__(self, host, port, strict) def connect(self): - self.sock = SSL.Connection(self.ssl_ctx) - if self.session: - self.sock.set_session(self.session) - self.sock.connect((self.host, self.port)) + error = None + # We ignore the returned sockaddr because SSL.Connection.connect needs + # a host name. + for (family, _, _, _, _) in \ + socket.getaddrinfo(self.host, self.port, 0, socket.SOCK_STREAM): + sock = None + try: + try: + sock = SSL.Connection(self.ssl_ctx, family=family) + if self.session is not None: + sock.set_session(self.session) + sock.connect((self.host, self.port)) + + self.sock = sock + sock = None + return + except socket.error, e: + # Other exception are probably SSL-related, in that case we + # abort and the exception is forwarded to the caller. + error = e + finally: + if sock is not None: + sock.close() + + if error is None: + raise AssertionError("Empty list returned by getaddrinfo") + raise error def close(self): # This kludges around line 545 of httplib.py, diff -urN M2Crypto/M2Crypto/SSL/Connection.py M2Crypto-0.21.1/M2Crypto/SSL/Connection.py --- M2Crypto/M2Crypto/SSL/Connection.py 2012-03-13 15:00:25.058411492 +0100 +++ M2Crypto-0.21.1/M2Crypto/SSL/Connection.py 2012-03-13 15:04:13.849836578 +0100 @@ -38,13 +38,13 @@ m2_bio_free = m2.bio_free m2_ssl_free = m2.ssl_free - def __init__(self, ctx, sock=None): + def __init__(self, ctx, sock=None, family=socket.AF_INET): self.ctx = ctx self.ssl = m2.ssl_new(self.ctx.ctx) if sock is not None: self.socket = sock else: - self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.socket = socket.socket(family, socket.SOCK_STREAM) self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self._fileno = self.socket.fileno()