From 6182c0204fffc3938ee2d9be9a2d7b532b45ea36 Mon Sep 17 00:00:00 2001 From: Chad Knight Date: Tue, 23 Oct 2018 07:05:48 -0500 Subject: [PATCH 1/3] always include Content-Type header in management requests --- auth0/v3/management/rest.py | 11 +++-------- auth0/v3/test/management/test_rest.py | 26 +++++++++++++++++++++++--- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/auth0/v3/management/rest.py b/auth0/v3/management/rest.py index cca81c37..09b9ffa5 100644 --- a/auth0/v3/management/rest.py +++ b/auth0/v3/management/rest.py @@ -16,6 +16,7 @@ class RestClient(object): def __init__(self, jwt, telemetry=True): self.jwt = jwt + self.base_headers = {'Content-Type': 'application/json'} if telemetry: py_version = platform.python_version() version = sys.modules['auth0'].__version__ @@ -36,13 +37,10 @@ def __init__(self, jwt, telemetry=True): ] }).encode('utf-8') - self.base_headers = { + self.base_headers.update({ 'User-Agent': 'Python/{}'.format(py_version), 'Auth0-Client': base64.b64encode(auth0_client), - 'Content-Type': 'application/json' - } - else: - self.base_headers = {} + }) def get(self, url, params=None): headers = self.base_headers.copy() @@ -57,7 +55,6 @@ def post(self, url, data=None): headers = self.base_headers.copy() headers.update({ 'Authorization': 'Bearer {}'.format(self.jwt), - 'Content-Type': 'application/json' }) response = requests.post(url, data=json.dumps(data or {}), headers=headers) @@ -77,7 +74,6 @@ def patch(self, url, data=None): headers = self.base_headers.copy() headers.update({ 'Authorization': 'Bearer {}'.format(self.jwt), - 'Content-Type': 'application/json' }) response = requests.patch(url, data=json.dumps(data or {}), headers=headers) @@ -87,7 +83,6 @@ def put(self, url, data=None): headers = self.base_headers.copy() headers.update({ 'Authorization': 'Bearer {}'.format(self.jwt), - 'Content-Type': 'application/json' }) response = requests.put(url, data=json.dumps(data or {}), headers=headers) diff --git a/auth0/v3/test/management/test_rest.py b/auth0/v3/test/management/test_rest.py index 52187b7b..47098138 100644 --- a/auth0/v3/test/management/test_rest.py +++ b/auth0/v3/test/management/test_rest.py @@ -13,7 +13,10 @@ class TestRest(unittest.TestCase): @mock.patch('requests.get') def test_get(self, mock_get): rc = RestClient(jwt='a-token', telemetry=False) - headers = {'Authorization': 'Bearer a-token'} + headers = { + 'Authorization': 'Bearer a-token', + 'Content-Type': 'application/json', + } mock_get.return_value.text = '["a", "b"]' mock_get.return_value.status_code = 200 @@ -198,6 +201,20 @@ def test_post_error_with_no_response_text(self, mock_post): self.assertEqual(context.exception.error_code, 'a0.sdk.internal.unknown') self.assertEqual(context.exception.message, '') + @mock.patch('requests.post') + def test_file_post_content_type_is_none(self, mock_post): + rc = RestClient(jwt='a-token', telemetry=False) + headers = {'Authorization': 'Bearer a-token'} + mock_post.return_value.status_code = 200 + mock_post.return_value.text = 'Success' + + data = {'some': 'data'} + files = [mock.Mock()] + + rc.file_post('the-url', data=data, files=files) + + mock_post.assert_called_once_with('the-url', data=data, files=files, headers=headers) + @mock.patch('requests.patch') def test_patch(self, mock_patch): rc = RestClient(jwt='a-token', telemetry=False) @@ -234,7 +251,10 @@ def test_patch_errors(self, mock_patch): @mock.patch('requests.delete') def test_delete(self, mock_delete): rc = RestClient(jwt='a-token', telemetry=False) - headers = {'Authorization': 'Bearer a-token'} + headers = { + 'Authorization': 'Bearer a-token', + 'Content-Type': 'application/json', + } mock_delete.return_value.text = '["a", "b"]' mock_delete.return_value.status_code = 200 @@ -263,7 +283,7 @@ def test_delete_errors(self, mock_delete): def test_disabled_telemetry(self): rc = RestClient(jwt='a-token', telemetry=False) - self.assertEqual(rc.base_headers, {}) + self.assertEqual(rc.base_headers, {'Content-Type': 'application/json'}) def test_enabled_telemetry(self): rc = RestClient(jwt='a-token', telemetry=True) From 647be5a675c540bc41f4c4eb2fb18947039ce536 Mon Sep 17 00:00:00 2001 From: Chad Knight Date: Tue, 23 Oct 2018 18:09:11 -0500 Subject: [PATCH 2/3] set authorization header in management constructor --- auth0/v3/management/rest.py | 23 ++++------------------- auth0/v3/test/management/test_rest.py | 6 +++++- 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/auth0/v3/management/rest.py b/auth0/v3/management/rest.py index 09b9ffa5..e3c6eac6 100644 --- a/auth0/v3/management/rest.py +++ b/auth0/v3/management/rest.py @@ -16,7 +16,10 @@ class RestClient(object): def __init__(self, jwt, telemetry=True): self.jwt = jwt - self.base_headers = {'Content-Type': 'application/json'} + self.base_headers = { + 'Authorization': 'Bearer {}'.format(self.jwt), + 'Content-Type': 'application/json', + } if telemetry: py_version = platform.python_version() version = sys.modules['auth0'].__version__ @@ -44,18 +47,12 @@ def __init__(self, jwt, telemetry=True): def get(self, url, params=None): headers = self.base_headers.copy() - headers.update({ - 'Authorization': 'Bearer {}'.format(self.jwt), - }) response = requests.get(url, params=params, headers=headers) return self._process_response(response) def post(self, url, data=None): headers = self.base_headers.copy() - headers.update({ - 'Authorization': 'Bearer {}'.format(self.jwt), - }) response = requests.post(url, data=json.dumps(data or {}), headers=headers) return self._process_response(response) @@ -63,36 +60,24 @@ def post(self, url, data=None): def file_post(self, url, data=None, files=None): headers = self.base_headers.copy() headers.pop('Content-Type', None) - headers.update({ - 'Authorization': 'Bearer {}'.format(self.jwt), - }) response = requests.post(url, data=data, files=files, headers=headers) return self._process_response(response) def patch(self, url, data=None): headers = self.base_headers.copy() - headers.update({ - 'Authorization': 'Bearer {}'.format(self.jwt), - }) response = requests.patch(url, data=json.dumps(data or {}), headers=headers) return self._process_response(response) def put(self, url, data=None): headers = self.base_headers.copy() - headers.update({ - 'Authorization': 'Bearer {}'.format(self.jwt), - }) response = requests.put(url, data=json.dumps(data or {}), headers=headers) return self._process_response(response) def delete(self, url, params=None): headers = self.base_headers.copy() - headers.update({ - 'Authorization': 'Bearer {}'.format(self.jwt), - }) response = requests.delete(url, headers=headers, params=params or {}) return self._process_response(response) diff --git a/auth0/v3/test/management/test_rest.py b/auth0/v3/test/management/test_rest.py index 47098138..9d578436 100644 --- a/auth0/v3/test/management/test_rest.py +++ b/auth0/v3/test/management/test_rest.py @@ -282,8 +282,12 @@ def test_delete_errors(self, mock_delete): def test_disabled_telemetry(self): rc = RestClient(jwt='a-token', telemetry=False) + expected_headers = { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer a-token', + } - self.assertEqual(rc.base_headers, {'Content-Type': 'application/json'}) + self.assertEqual(rc.base_headers, expected_headers) def test_enabled_telemetry(self): rc = RestClient(jwt='a-token', telemetry=True) From 280629ee42ac091c8f9977611d0dc39221a40800 Mon Sep 17 00:00:00 2001 From: Chad Knight Date: Thu, 8 Nov 2018 09:27:41 -0600 Subject: [PATCH 3/3] string format in AuthenticationBase --- auth0/v3/authentication/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth0/v3/authentication/base.py b/auth0/v3/authentication/base.py index 21e02aab..c8d03cad 100644 --- a/auth0/v3/authentication/base.py +++ b/auth0/v3/authentication/base.py @@ -45,7 +45,7 @@ def __init__(self, domain, telemetry=True): }).encode('utf-8') self.base_headers.update({ - 'User-Agent': 'Python/%s' % py_version, + 'User-Agent': 'Python/{}'.format(py_version), 'Auth0-Client': base64.b64encode(auth0_client), })