diff options
| author | Jenkins <jenkins@review.openstack.org> | 2015-02-26 21:29:06 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2015-02-26 21:29:06 +0000 |
| commit | db0179f5c4fa02515b1706e74da545bc1eeb6b54 (patch) | |
| tree | e248f931c2065e33b83fef8a6d5371d8d538aa01 /glanceclient/common/https.py | |
| parent | 519672f5d5251ea193f08f967a9216848d209916 (diff) | |
| parent | 7ee96cbe390b2492f8d837c93f33a8f5bebdb388 (diff) | |
| download | python-glanceclient-db0179f5c4fa02515b1706e74da545bc1eeb6b54.tar.gz | |
Merge "Register our own ConnectionPool without globals"
Diffstat (limited to 'glanceclient/common/https.py')
| -rw-r--r-- | glanceclient/common/https.py | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/glanceclient/common/https.py b/glanceclient/common/https.py index ac140e4..af962b8 100644 --- a/glanceclient/common/https.py +++ b/glanceclient/common/https.py @@ -19,12 +19,11 @@ import struct import OpenSSL from requests import adapters +from requests import compat try: from requests.packages.urllib3 import connectionpool - from requests.packages.urllib3 import poolmanager except ImportError: from urllib3 import connectionpool - from urllib3 import poolmanager from oslo_utils import encodeutils import six @@ -70,19 +69,37 @@ class HTTPSAdapter(adapters.HTTPAdapter): one. """ - def __init__(self, *args, **kwargs): - # NOTE(flaper87): This line forces poolmanager to use - # glanceclient HTTPSConnection - classes_by_scheme = poolmanager.pool_classes_by_scheme - classes_by_scheme["glance+https"] = HTTPSConnectionPool - super(HTTPSAdapter, self).__init__(*args, **kwargs) - def request_url(self, request, proxies): # NOTE(flaper87): Make sure the url is encoded, otherwise # python's standard httplib will fail with a TypeError. url = super(HTTPSAdapter, self).request_url(request, proxies) return encodeutils.safe_encode(url) + def _create_glance_httpsconnectionpool(self, url): + kw = self.poolmanager.connection_kw + # Parse the url to get the scheme, host, and port + parsed = compat.urlparse(url) + # If there is no port specified, we should use the standard HTTPS port + port = parsed.port or 443 + pool = HTTPSConnectionPool(parsed.host, port, **kw) + + with self.poolmanager.pools.lock: + self.poolmanager.pools[(parsed.scheme, parsed.host, port)] = pool + + return pool + + def get_connection(self, url, proxies=None): + try: + return super(HTTPSAdapter, self).get_connection(url, proxies) + except KeyError: + # NOTE(sigamvirus24): This works around modifying a module global + # which fixes bug #1396550 + # The scheme is most likely glance+https but check anyway + if not url.startswith('glance+https://'): + raise + + return self._create_glance_httpsconnectionpool(url) + def cert_verify(self, conn, url, verify, cert): super(HTTPSAdapter, self).cert_verify(conn, url, verify, cert) conn.ca_certs = verify[0] |
