summaryrefslogtreecommitdiff
path: root/swiftclient/utils.py
diff options
context:
space:
mode:
authorDavide Guerri <davide.guerri@hp.com>2013-11-25 10:42:56 +0000
committerDavide Guerri <davide.guerri@hp.com>2013-12-10 12:12:28 +0000
commit716b4e722c98396dc1477a04120eb0fedf388799 (patch)
treeab6e0ebde0c7b3972d72445f0a2dd6ec04751bcf /swiftclient/utils.py
parent04e0cb27839cec474bce383d4364fd76dcb6e4b2 (diff)
downloadpython-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/utils.py')
-rw-r--r--swiftclient/utils.py50
1 files changed, 50 insertions, 0 deletions
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()