From f4a75c61c2d2cf7f7adc81051bcd70ff78145780 Mon Sep 17 00:00:00 2001 From: Sam Thursfield Date: Mon, 24 Nov 2014 11:52:31 +0000 Subject: Support HTTP(S) proxies which don't require username and password Previously the proxy.conf file had to contain 'username' and 'password' fields, which meant that it didn't work for some HTTP proxy setups. --- lorrycontroller/proxy.py | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/lorrycontroller/proxy.py b/lorrycontroller/proxy.py index 44749c9..53d0667 100644 --- a/lorrycontroller/proxy.py +++ b/lorrycontroller/proxy.py @@ -20,6 +20,21 @@ import urllib import urllib2 +def build_proxy_url(protocol, proxy_config): + """Build a proxy URL from data in our proxy configuration format.""" + + hostname = urllib.quote(proxy_config['hostname']) + url = '%s:%s' % (hostname, proxy_config['port']) + + if 'username' not in proxy_config: + return '%s://%s/' % (protocol, url) + elif 'password' not in proxy_config: + return '%s://%s@%s/' % (protocol, proxy_config['username'], url) + else: + return '%s://%s:%s@%s/' % (protocol, proxy_config['username'], + proxy_config['password'], url) + + def setup_proxy(config_filename): """Tell urllib2 to use a proxy for http action by lorry-controller. @@ -32,18 +47,18 @@ def setup_proxy(config_filename): return with open(config_filename, 'r') as f: - proxy = json.load(f) - + proxy_config = json.load(f) + + http_proxy_url = build_proxy_url('http', proxy_config) + https_proxy_url = build_proxy_url('https', proxy_config) + # set the required environment variables - hostname = urllib.quote(proxy['hostname']) - user = '%s:%s' % (proxy['username'], proxy['password']) - url = '%s:%s' % (hostname, proxy['port']) - os.environ['http_proxy'] = 'http://%s@%s' % (user, url) - os.environ['https_proxy'] = 'https://%s@%s' % (user, url) - + os.environ['http_proxy'] = http_proxy_url + os.environ['https_proxy'] = https_proxy_url + # create a ProxyHandler - proxies = {'http_proxy': 'http://%s@%s' % (user, url), - 'https_proxy': 'https://%s@%s' % (user, url)} + proxies = {'http_proxy': http_proxy_url, + 'https_proxy': https_proxy_url} proxy_handler = urllib2.ProxyHandler(proxies) # install an opener to use the proxy -- cgit v1.2.1