From e514920e190bbda3ddd35242bf566e7d752725a1 Mon Sep 17 00:00:00 2001 From: Dmitry Klimenko Date: Sat, 12 Nov 2016 01:39:37 +0300 Subject: [PATCH 01/11] Unable unicode in basic http auth Fixed the issue with unicode characters in basic http auth --- requests/auth.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/requests/auth.py b/requests/auth.py index d1196daa..057d723e 100644 --- a/requests/auth.py +++ b/requests/auth.py @@ -15,7 +15,7 @@ import threading from base64 import b64encode -from .compat import urlparse, str +from .compat import urlparse, str, bytes from .cookies import extract_cookies_to_jar from ._internal_utils import to_native_string from .utils import parse_dict_header @@ -27,6 +27,12 @@ CONTENT_TYPE_MULTI_PART = 'multipart/form-data' def _basic_auth_str(username, password): """Returns a Basic Auth string.""" + + if isinstance(username, bytes): + username = username.decode('latin1') + + if isinstance(password, bytes): + password = password.decode('latin1') authstr = 'Basic ' + to_native_string( b64encode(('%s:%s' % (username, password)).encode('latin1')).strip() From 329a5cfdd4500fb1ce405a3242ef95f9197d24ba Mon Sep 17 00:00:00 2001 From: Dmitry Klimenko Date: Thu, 17 Nov 2016 19:50:53 +0300 Subject: [PATCH 02/11] Order of type check --- requests/auth.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/requests/auth.py b/requests/auth.py index 057d723e..20b9883c 100644 --- a/requests/auth.py +++ b/requests/auth.py @@ -28,14 +28,14 @@ CONTENT_TYPE_MULTI_PART = 'multipart/form-data' def _basic_auth_str(username, password): """Returns a Basic Auth string.""" - if isinstance(username, bytes): - username = username.decode('latin1') + if isinstance(username, str): + username = username.encode('latin1') - if isinstance(password, bytes): - password = password.decode('latin1') + if isinstance(password, str): + password = password.encode('latin1') authstr = 'Basic ' + to_native_string( - b64encode(('%s:%s' % (username, password)).encode('latin1')).strip() + b64encode(b':'.join((username, password))).strip() ) return authstr From 2185fac6261bd4a3e625f7bdb267696d7ba1bf56 Mon Sep 17 00:00:00 2001 From: Dmitry Klimenko Date: Thu, 17 Nov 2016 19:52:13 +0300 Subject: [PATCH 03/11] remove extra import --- requests/auth.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requests/auth.py b/requests/auth.py index 20b9883c..3460c8b5 100644 --- a/requests/auth.py +++ b/requests/auth.py @@ -15,7 +15,7 @@ import threading from base64 import b64encode -from .compat import urlparse, str, bytes +from .compat import urlparse, str from .cookies import extract_cookies_to_jar from ._internal_utils import to_native_string from .utils import parse_dict_header From 37bde4b63869ad4635cbb9953a7d0c229f30daa1 Mon Sep 17 00:00:00 2001 From: Dmitry Klimenko Date: Thu, 17 Nov 2016 20:22:32 +0300 Subject: [PATCH 04/11] added unicode auth test --- tests/test_requests.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/test_requests.py b/tests/test_requests.py index 9f0da5cc..57efcae6 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -460,9 +460,14 @@ class TestRequests: r = requests.put(httpbin('put')) assert r.status_code == 200 - def test_BASICAUTH_TUPLE_HTTP_200_OK_GET(self, httpbin): - auth = ('user', 'pass') - url = httpbin('basic-auth', 'user', 'pass') + @pytest.mark.parametrize( + 'username, password', ( + ('user', 'pass'), + ('имя'.encode('utf-8'), 'пароль'.encode('utf-8')), + )) + def test_BASICAUTH_TUPLE_HTTP_200_OK_GET(self, httpbin, username, password): + auth = (username, password) + url = httpbin('basic-auth', username, password) r = requests.get(url, auth=auth) assert r.status_code == 200 From bf3e960e159ad19af557b26abdf633b7b8117cad Mon Sep 17 00:00:00 2001 From: Dmitry Klimenko Date: Thu, 17 Nov 2016 23:13:03 +0300 Subject: [PATCH 05/11] fixed usage unicode string --- tests/test_requests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_requests.py b/tests/test_requests.py index 57efcae6..132eac5e 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -463,7 +463,7 @@ class TestRequests: @pytest.mark.parametrize( 'username, password', ( ('user', 'pass'), - ('имя'.encode('utf-8'), 'пароль'.encode('utf-8')), + (u'имя'.encode('utf-8'), u'пароль'.encode('utf-8')), )) def test_BASICAUTH_TUPLE_HTTP_200_OK_GET(self, httpbin, username, password): auth = (username, password) From 7c4821231fcd8af8ef1cd835713933ef3ae58032 Mon Sep 17 00:00:00 2001 From: Dmitry Klimenko Date: Fri, 18 Nov 2016 13:14:08 +0300 Subject: [PATCH 06/11] Fixed: httpbin doesn't support bytes --- tests/test_requests.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/test_requests.py b/tests/test_requests.py index 132eac5e..f4c0364a 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -461,14 +461,19 @@ class TestRequests: assert r.status_code == 200 @pytest.mark.parametrize( - 'username, password', ( - ('user', 'pass'), - (u'имя'.encode('utf-8'), u'пароль'.encode('utf-8')), + 'username, password, auth_str', ( + ('user', 'pass', 'Basic dXNlcjpwYXNz'), + (u'имя'.encode('utf-8'), u'пароль'.encode('utf-8'), 'Basic 0LjQvNGPOtC/0LDRgNC+0LvRjA=='), )) - def test_BASICAUTH_TUPLE_HTTP_200_OK_GET(self, httpbin, username, password): + def test_BASICAUTH_TUPLE_HTTP_200_OK_GET(self, httpbin, username, password, auth_str): auth = (username, password) - url = httpbin('basic-auth', username, password) + url = httpbin('get') + + r = Request('GET', url, auth=auth) + p = r.prepare() + assert p['Authorization'] == auth_str + r = requests.get(url, auth=auth) assert r.status_code == 200 From 4f0efdb77e33b340ae9e478c456634ef628e665a Mon Sep 17 00:00:00 2001 From: Dmitry Klimenko Date: Fri, 18 Nov 2016 13:31:31 +0300 Subject: [PATCH 07/11] unicode test for _basic_auth_str --- tests/test_requests.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/tests/test_requests.py b/tests/test_requests.py index f4c0364a..7b7c736c 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -461,9 +461,9 @@ class TestRequests: assert r.status_code == 200 @pytest.mark.parametrize( - 'username, password, auth_str', ( - ('user', 'pass', 'Basic dXNlcjpwYXNz'), - (u'имя'.encode('utf-8'), u'пароль'.encode('utf-8'), 'Basic 0LjQvNGPOtC/0LDRgNC+0LvRjA=='), + 'username, password', ( + ('user', 'pass'), + (u'имя'.encode('utf-8'), u'пароль'.encode('utf-8')), )) def test_BASICAUTH_TUPLE_HTTP_200_OK_GET(self, httpbin, username, password, auth_str): auth = (username, password) @@ -472,7 +472,7 @@ class TestRequests: r = Request('GET', url, auth=auth) p = r.prepare() - assert p['Authorization'] == auth_str + assert p['Authorization'] == _basic_auth_str(username, password) r = requests.get(url, auth=auth) assert r.status_code == 200 @@ -1578,10 +1578,15 @@ class TestRequests: self._patch_adapter_gzipped_redirect(s, url) s.get(url) - def test_basic_auth_str_is_always_native(self): - s = _basic_auth_str("test", "test") + @pytest.mark.parametrize( + 'username, password, auth_str', ( + ('test', 'test', 'Basic dGVzdDp0ZXN0'), + (u'имя'.encode('utf-8'), u'пароль'.encode('utf-8'), 'Basic 0LjQvNGPOtC/0LDRgNC+0LvRjA=='), + )) + def test_basic_auth_str_is_always_native(self, username, password, auth_str): + s = _basic_auth_str(username, password) assert isinstance(s, builtin_str) - assert s == "Basic dGVzdDp0ZXN0" + assert s == auth_str def test_requests_history_is_saved(self, httpbin): r = requests.get(httpbin('redirect/5')) From 55dea233ce52457ff35654b9a01f188e0e695304 Mon Sep 17 00:00:00 2001 From: Dmitry Klimenko Date: Fri, 18 Nov 2016 15:19:43 +0300 Subject: [PATCH 08/11] fixed some error --- tests/test_requests.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_requests.py b/tests/test_requests.py index 7b7c736c..88e48c32 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -465,14 +465,14 @@ class TestRequests: ('user', 'pass'), (u'имя'.encode('utf-8'), u'пароль'.encode('utf-8')), )) - def test_BASICAUTH_TUPLE_HTTP_200_OK_GET(self, httpbin, username, password, auth_str): + def test_BASICAUTH_TUPLE_HTTP_200_OK_GET(self, httpbin, username, password): auth = (username, password) url = httpbin('get') - - r = Request('GET', url, auth=auth) + + r = requests.Request('GET', url, auth=auth) p = r.prepare() - assert p['Authorization'] == _basic_auth_str(username, password) + assert p.headers['Authorization'] == _basic_auth_str(username, password) r = requests.get(url, auth=auth) assert r.status_code == 200 @@ -1582,7 +1582,7 @@ class TestRequests: 'username, password, auth_str', ( ('test', 'test', 'Basic dGVzdDp0ZXN0'), (u'имя'.encode('utf-8'), u'пароль'.encode('utf-8'), 'Basic 0LjQvNGPOtC/0LDRgNC+0LvRjA=='), - )) + )) def test_basic_auth_str_is_always_native(self, username, password, auth_str): s = _basic_auth_str(username, password) assert isinstance(s, builtin_str) From e15280e49d9ee15bd7b5f3a00862d5f0a720b8e1 Mon Sep 17 00:00:00 2001 From: Dmitry Klimenko Date: Fri, 18 Nov 2016 19:04:51 +0300 Subject: [PATCH 09/11] fixed: httpbin with unicode auth --- tests/test_requests.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tests/test_requests.py b/tests/test_requests.py index 88e48c32..69c9d972 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -18,7 +18,7 @@ from requests.adapters import HTTPAdapter from requests.auth import HTTPDigestAuth, _basic_auth_str from requests.compat import ( Morsel, cookielib, getproxies, str, urlparse, - builtin_str, OrderedDict) + builtin_str, OrderedDict, bytes) from requests.cookies import ( cookiejar_from_dict, morsel_to_cookie, merge_cookies) from requests.exceptions import ( @@ -467,7 +467,18 @@ class TestRequests: )) def test_BASICAUTH_TUPLE_HTTP_200_OK_GET(self, httpbin, username, password): auth = (username, password) - url = httpbin('get') + + if isinstance(username, bytes): + httpbin_username = username.decode('latin1') + else: + httpbin_username = username + + if isinstance(password, bytes): + httpbin_password = password.decode('latin1') + else: + httpbin_password = password + + url = httpbin('basic-auth', httpbin_username, httpbin_password) r = requests.Request('GET', url, auth=auth) p = r.prepare() From 3b84be3c99edf49c4770882b83726b98751ec1c3 Mon Sep 17 00:00:00 2001 From: Dmitry Klimenko Date: Fri, 18 Nov 2016 20:39:55 +0300 Subject: [PATCH 10/11] changed behavior of basic-http-auth test --- tests/test_requests.py | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/tests/test_requests.py b/tests/test_requests.py index 69c9d972..64cc773f 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -18,7 +18,7 @@ from requests.adapters import HTTPAdapter from requests.auth import HTTPDigestAuth, _basic_auth_str from requests.compat import ( Morsel, cookielib, getproxies, str, urlparse, - builtin_str, OrderedDict, bytes) + builtin_str, OrderedDict) from requests.cookies import ( cookiejar_from_dict, morsel_to_cookie, merge_cookies) from requests.exceptions import ( @@ -467,34 +467,12 @@ class TestRequests: )) def test_BASICAUTH_TUPLE_HTTP_200_OK_GET(self, httpbin, username, password): auth = (username, password) - - if isinstance(username, bytes): - httpbin_username = username.decode('latin1') - else: - httpbin_username = username - - if isinstance(password, bytes): - httpbin_password = password.decode('latin1') - else: - httpbin_password = password - - url = httpbin('basic-auth', httpbin_username, httpbin_password) + url = httpbin('get') r = requests.Request('GET', url, auth=auth) p = r.prepare() assert p.headers['Authorization'] == _basic_auth_str(username, password) - - r = requests.get(url, auth=auth) - assert r.status_code == 200 - - r = requests.get(url) - assert r.status_code == 401 - - s = requests.session() - s.auth = auth - r = s.get(url) - assert r.status_code == 200 @pytest.mark.parametrize( 'url, exception', ( From 005f93fd0f2ead34af4c42d245b0c2ed2f91ba09 Mon Sep 17 00:00:00 2001 From: Dmitry Klimenko Date: Mon, 21 Nov 2016 21:42:44 +0300 Subject: [PATCH 11/11] added new test, original test restored --- tests/test_requests.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/tests/test_requests.py b/tests/test_requests.py index 64cc773f..f45d3527 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -460,12 +460,27 @@ class TestRequests: r = requests.put(httpbin('put')) assert r.status_code == 200 + def test_BASICAUTH_TUPLE_HTTP_200_OK_GET(self, httpbin): + auth = ('user', 'pass') + url = httpbin('basic-auth', 'user', 'pass') + + r = requests.get(url, auth=auth) + assert r.status_code == 200 + + r = requests.get(url) + assert r.status_code == 401 + + s = requests.session() + s.auth = auth + r = s.get(url) + assert r.status_code == 200 + @pytest.mark.parametrize( 'username, password', ( ('user', 'pass'), (u'имя'.encode('utf-8'), u'пароль'.encode('utf-8')), )) - def test_BASICAUTH_TUPLE_HTTP_200_OK_GET(self, httpbin, username, password): + def test_set_basicauth(self, httpbin, username, password): auth = (username, password) url = httpbin('get')