From 4f786e4f6240d3518d1add2faf49166301580732 Mon Sep 17 00:00:00 2001 From: Cory Benfield Date: Sun, 1 Dec 2013 10:23:09 +0000 Subject: [PATCH 1/2] Tests for #1767. --- test_requests.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test_requests.py b/test_requests.py index 3b673956..8cb548b5 100755 --- a/test_requests.py +++ b/test_requests.py @@ -563,6 +563,18 @@ class RequestsTestCase(unittest.TestCase): url = 'http://user:pass@complex.url.com/path?query=yes' assert ('user', 'pass') == requests.utils.get_auth_from_url(url) + def test_get_auth_from_url_encoded_spaces(self): + url = 'http://user:pass%20pass@complex.url.com/path?query=yes' + assert ('user', 'pass pass') == requests.utils.get_auth_from_url(url) + + def test_get_auth_from_url_not_encoded_spaces(self): + url = 'http://user:pass pass@complex.url.com/path?query=yes' + assert ('user', 'pass pass') == requests.utils.get_auth_from_url(url) + + def test_get_auth_from_url_percent_chars(self): + url = 'http://user%user:pass@complex.url.com/path?query=yes' + assert ('user%user', 'pass') == requests.utils.get_auth_from_url(url) + def test_cannot_send_unprepared_requests(self): r = requests.Request(url=HTTPBIN) with pytest.raises(ValueError): From e2961b9f91e55199fac9d67f82180d06b0a7be35 Mon Sep 17 00:00:00 2001 From: Cory Benfield Date: Sun, 1 Dec 2013 10:28:49 +0000 Subject: [PATCH 2/2] Unquote the URL before extracting the auth. --- requests/utils.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/requests/utils.py b/requests/utils.py index 4283560e..57292c35 100644 --- a/requests/utils.py +++ b/requests/utils.py @@ -21,8 +21,8 @@ import sys from . import __version__ from . import certs from .compat import parse_http_list as _parse_list_header -from .compat import (quote, urlparse, bytes, str, OrderedDict, urlunparse, - is_py2, is_py3, builtin_str, getproxies, proxy_bypass) +from .compat import (quote, urlparse, bytes, str, OrderedDict, unquote, is_py2, + builtin_str, getproxies, proxy_bypass) from .cookies import RequestsCookieJar, cookiejar_from_dict from .structures import CaseInsensitiveDict from .exceptions import MissingSchema, InvalidURL @@ -558,6 +558,7 @@ def get_auth_from_url(url): """Given a url with authentication components, extract them into a tuple of username,password.""" if url: + url = unquote(url) parsed = urlparse(url) return (parsed.username, parsed.password) else: