From 641f4611b285d8c3b9bee7d6ce62ea1c4d4fc242 Mon Sep 17 00:00:00 2001 From: Cory Benfield Date: Thu, 27 Dec 2012 13:37:36 +0000 Subject: [PATCH] Make sure proxies have their scheme attached. --- requests/adapters.py | 5 ++++- requests/utils.py | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/requests/adapters.py b/requests/adapters.py index 557c005..2c321e9 100644 --- a/requests/adapters.py +++ b/requests/adapters.py @@ -14,7 +14,8 @@ from .models import Response from .packages.urllib3.poolmanager import PoolManager, proxy_from_url from .hooks import dispatch_hook from .compat import urlparse, basestring, urldefrag -from .utils import DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers +from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers, + prepend_scheme_if_needed) from .structures import CaseInsensitiveDict from .packages.urllib3.exceptions import MaxRetryError from .packages.urllib3.exceptions import TimeoutError @@ -116,6 +117,8 @@ class HTTPAdapter(BaseAdapter): proxy = proxies.get(urlparse(url).scheme) if proxy: + proxy = prepend_scheme_if_needed(proxy, urlparse(url).scheme) + print proxy conn = proxy_from_url(proxy) else: conn = self.poolmanager.connection_from_url(url) diff --git a/requests/utils.py b/requests/utils.py index 8abebb9..dadd620 100644 --- a/requests/utils.py +++ b/requests/utils.py @@ -21,7 +21,7 @@ from netrc import netrc, NetrcParseError from . import __version__ from . import certs from .compat import parse_http_list as _parse_list_header -from .compat import quote, urlparse, bytes, str, OrderedDict +from .compat import quote, urlparse, bytes, str, OrderedDict, urlunparse from .cookies import RequestsCookieJar, cookiejar_from_dict _hush_pyflakes = (RequestsCookieJar,) @@ -561,3 +561,17 @@ def guess_json_utf(data): return 'utf-32-le' # Did not detect a valid UTF-32 ascii-range character return None + + +def prepend_scheme_if_needed(url, new_scheme): + '''Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument.''' + scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) + + # urlparse is a finicky beast, and sometimes decides that there isn't a + # netloc present. Assume that it's being over-cautious, and switch netloc + # and path if urlparse decided there was no netloc. + if not netloc: + netloc, path = path, netloc + + return urlunparse((scheme, netloc, path, params, query, fragment)) -- 2.7.4