Make sure proxies have their scheme attached.
authorCory Benfield <lukasaoz@gmail.com>
Thu, 27 Dec 2012 13:37:36 +0000 (13:37 +0000)
committerCory Benfield <lukasaoz@gmail.com>
Thu, 27 Dec 2012 13:37:36 +0000 (13:37 +0000)
requests/adapters.py
requests/utils.py

index 557c0052fa6ecf3190605053ba6b4a1e15818144..2c321e9c19bce1e3c38e46eb881b2152f1bc65b2 100644 (file)
@@ -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)
index 8abebb9dacc8afe58c2fe4c013efcdf4c2e467d9..dadd6203273c40eb2303ed1029470ce2a2b8500c 100644 (file)
@@ -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))