diff options
author | Davide Guerri <davide.guerri@hp.com> | 2013-11-25 10:42:56 +0000 |
---|---|---|
committer | Davide Guerri <davide.guerri@hp.com> | 2013-12-10 12:12:28 +0000 |
commit | 716b4e722c98396dc1477a04120eb0fedf388799 (patch) | |
tree | ab6e0ebde0c7b3972d72445f0a2dd6ec04751bcf /swiftclient | |
parent | 04e0cb27839cec474bce383d4364fd76dcb6e4b2 (diff) | |
download | python-swiftclient-716b4e722c98396dc1477a04120eb0fedf388799.tar.gz |
Enable usage of proxies defined in environment (http(s)_proxy).
As far as proxies usage is concerned, keystone-client API and swift-client API behave differently because the former uses python Request library while the latter uses raw httplib. As a result, Keystone authentication honors environment variables http_proxy, https_proxy and no_proxy while Swift doesn't.
This patch, which code is mainly borrowed from Python Requests, makes Swift
data connections and Swift authentication connections behaving homogeneously.
Change-Id: Ic8a0089c35c458d7ed96e572e22429014298fe4c
Diffstat (limited to 'swiftclient')
-rw-r--r-- | swiftclient/client.py | 10 | ||||
-rw-r--r-- | swiftclient/utils.py | 50 |
2 files changed, 58 insertions, 2 deletions
diff --git a/swiftclient/client.py b/swiftclient/client.py index 8dc4b71..edd0913 100644 --- a/swiftclient/client.py +++ b/swiftclient/client.py @@ -29,6 +29,7 @@ from httplib import HTTPException, HTTPConnection, HTTPSConnection from time import sleep from swiftclient.exceptions import ClientException, InvalidHeadersException +from swiftclient.utils import get_environ_proxies try: from swiftclient.https_connection import HTTPSConnectionNoSSLComp @@ -138,8 +139,13 @@ def http_connection(url, proxy=None, ssl_compression=True): """ url = encode_utf8(url) parsed = urlparse(url) - proxy_parsed = urlparse(proxy) if proxy else None - host = proxy_parsed if proxy else parsed.netloc + if proxy: + proxy_parsed = urlparse(proxy) + else: + proxies = get_environ_proxies(parsed.netloc) + proxy = proxies.get(parsed.scheme, None) + proxy_parsed = urlparse(proxy) if proxy else None + host = proxy_parsed.netloc if proxy else parsed.netloc if parsed.scheme == 'http': conn = HTTPConnection(host) elif parsed.scheme == 'https': diff --git a/swiftclient/utils.py b/swiftclient/utils.py index a038dcc..a74eada 100644 --- a/swiftclient/utils.py +++ b/swiftclient/utils.py @@ -14,6 +14,23 @@ # limitations under the License. """Miscellaneous utility functions for use with Swift.""" +import sys +import os + +_ver = sys.version_info + +#: Python 2.x? +is_py2 = (_ver[0] == 2) + +#: Python 3.x? +is_py3 = (_ver[0] == 3) + +if is_py2: + from urllib import getproxies, proxy_bypass +elif is_py3: + from urllib.request import getproxies, proxy_bypass + + TRUE_VALUES = set(('true', '1', 'yes', 'on', 't', 'y')) @@ -55,3 +72,36 @@ def prt_bytes(bytes, human_flag): bytes = '%12s' % bytes return(bytes) + + +# get_environ_proxies function, borrowed from python Requests +# (www.python-requests.org) +def get_environ_proxies(netloc): + """Return a dict of environment proxies.""" + + get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy = get_proxy('no_proxy') + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the netloc, both with and without the port. + no_proxy = no_proxy.replace(' ', '').split(',') + + for host in no_proxy: + if netloc.endswith(host) or netloc.split(':')[0].endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return {} + + # If the system proxy settings indicate that this URL should be bypassed, + # don't proxy. + if proxy_bypass(netloc): + return {} + + # If we get here, we either didn't have no_proxy set or we're not going + # anywhere that no_proxy applies to, and the system settings don't require + # bypassing the proxy for the current URL. + return getproxies() |