1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

Conditionally create the CustomHTTPSConnection class only if we have the required baseclasses.

Fixes #11918
This commit is contained in:
Toshio Kuratomi 2015-12-16 07:38:51 -08:00
parent 72a0654b81
commit 33863eb653

View file

@ -310,42 +310,45 @@ class NoSSLError(SSLValidationError):
"""Needed to connect to an HTTPS url but no ssl library available to verify the certificate""" """Needed to connect to an HTTPS url but no ssl library available to verify the certificate"""
pass pass
# Some environments (Google Compute Engine's CoreOS deploys) do not compile
# against openssl and thus do not have any HTTPS support.
CustomHTTPSConnection = CustomHTTPSHandler = None
if hasattr(httplib, 'HTTPSConnection') and hasattr(urllib2, 'HTTPSHandler'):
class CustomHTTPSConnection(httplib.HTTPSConnection):
def __init__(self, *args, **kwargs):
httplib.HTTPSConnection.__init__(self, *args, **kwargs)
if HAS_SSLCONTEXT:
self.context = create_default_context()
if self.cert_file:
self.context.load_cert_chain(self.cert_file, self.key_file)
class CustomHTTPSConnection(httplib.HTTPSConnection): def connect(self):
def __init__(self, *args, **kwargs): "Connect to a host on a given (SSL) port."
httplib.HTTPSConnection.__init__(self, *args, **kwargs)
if HAS_SSLCONTEXT:
self.context = create_default_context()
if self.cert_file:
self.context.load_cert_chain(self.cert_file, self.key_file)
def connect(self): if hasattr(self, 'source_address'):
"Connect to a host on a given (SSL) port." sock = socket.create_connection((self.host, self.port), self.timeout, self.source_address)
else:
sock = socket.create_connection((self.host, self.port), self.timeout)
if hasattr(self, 'source_address'): server_hostname = self.host
sock = socket.create_connection((self.host, self.port), self.timeout, self.source_address) # Note: self._tunnel_host is not available on py < 2.6 but this code
else: # isn't used on py < 2.6 (lack of create_connection)
sock = socket.create_connection((self.host, self.port), self.timeout) if self._tunnel_host:
self.sock = sock
self._tunnel()
server_hostname = self._tunnel_host
server_hostname = self.host if HAS_SSLCONTEXT:
# Note: self._tunnel_host is not available on py < 2.6 but this code self.sock = self.context.wrap_socket(sock, server_hostname=server_hostname)
# isn't used on py < 2.6 (lack of create_connection) else:
if self._tunnel_host: self.sock = ssl.wrap_socket(sock, keyfile=self.key_file, certfile=self.cert_file, ssl_version=PROTOCOL)
self.sock = sock
self._tunnel()
server_hostname = self._tunnel_host
if HAS_SSLCONTEXT: class CustomHTTPSHandler(urllib2.HTTPSHandler):
self.sock = self.context.wrap_socket(sock, server_hostname=server_hostname)
else:
self.sock = ssl.wrap_socket(sock, keyfile=self.key_file, certfile=self.cert_file, ssl_version=PROTOCOL)
class CustomHTTPSHandler(urllib2.HTTPSHandler): def https_open(self, req):
return self.do_open(CustomHTTPSConnection, req)
def https_open(self, req): https_request = urllib2.AbstractHTTPHandler.do_request_
return self.do_open(CustomHTTPSConnection, req)
https_request = urllib2.AbstractHTTPHandler.do_request_
def generic_urlparse(parts): def generic_urlparse(parts):
''' '''
@ -673,8 +676,9 @@ def open_url(url, data=None, headers=None, method=None, use_proxy=True,
handlers.append(proxyhandler) handlers.append(proxyhandler)
# pre-2.6 versions of python cannot use the custom https # pre-2.6 versions of python cannot use the custom https
# handler, since the socket class is lacking this method # handler, since the socket class is lacking create_connection.
if hasattr(socket, 'create_connection'): # Some python builds lack HTTPS support.
if hasattr(socket, 'create_connection') and CustomHTTPSHandler:
handlers.append(CustomHTTPSHandler) handlers.append(CustomHTTPSHandler)
opener = urllib2.build_opener(*handlers) opener = urllib2.build_opener(*handlers)