diff --git a/auth0/v3/authentication/base.py b/auth0/v3/authentication/base.py index 8e60ff88..e16c735c 100644 --- a/auth0/v3/authentication/base.py +++ b/auth0/v3/authentication/base.py @@ -18,9 +18,9 @@ class AuthenticationBase(object): (defaults to True) """ - def __init__(self, domain, telemetry=True): + def __init__(self, domain, telemetry=True, timeout=5.0): self.domain = domain - + self.timeout = timeout self.base_headers = {'Content-Type': 'application/json'} if telemetry: @@ -43,13 +43,13 @@ def __init__(self, domain, telemetry=True): def post(self, url, data=None, headers=None): request_headers = self.base_headers.copy() request_headers.update(headers or {}) - response = requests.post(url=url, json=data, headers=request_headers) + response = requests.post(url=url, json=data, headers=request_headers, timeout=self.timeout) return self._process_response(response) def get(self, url, params=None, headers=None): request_headers = self.base_headers.copy() request_headers.update(headers or {}) - response = requests.get(url=url, params=params, headers=request_headers) + response = requests.get(url=url, params=params, headers=request_headers, timeout=self.timeout) return self._process_response(response) def _process_response(self, response): diff --git a/auth0/v3/management/blacklists.py b/auth0/v3/management/blacklists.py index 534f1909..ff1c47ff 100644 --- a/auth0/v3/management/blacklists.py +++ b/auth0/v3/management/blacklists.py @@ -13,9 +13,9 @@ class Blacklists(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.url = 'https://{}/api/v2/blacklists/tokens'.format(domain) - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def get(self, aud=None): """Retrieves the jti and aud of all tokens in the blacklist. diff --git a/auth0/v3/management/client_grants.py b/auth0/v3/management/client_grants.py index 43222569..5cfda298 100644 --- a/auth0/v3/management/client_grants.py +++ b/auth0/v3/management/client_grants.py @@ -14,9 +14,9 @@ class ClientGrants(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/client-grants'.format(self.domain) diff --git a/auth0/v3/management/clients.py b/auth0/v3/management/clients.py index c0142179..80a7b81e 100644 --- a/auth0/v3/management/clients.py +++ b/auth0/v3/management/clients.py @@ -14,9 +14,9 @@ class Clients(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/clients'.format(self.domain) diff --git a/auth0/v3/management/connections.py b/auth0/v3/management/connections.py index 2e2db1c5..0cae9aba 100644 --- a/auth0/v3/management/connections.py +++ b/auth0/v3/management/connections.py @@ -13,9 +13,9 @@ class Connections(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/connections'.format(self.domain) diff --git a/auth0/v3/management/custom_domains.py b/auth0/v3/management/custom_domains.py index 98e3d45e..82d24b43 100644 --- a/auth0/v3/management/custom_domains.py +++ b/auth0/v3/management/custom_domains.py @@ -14,9 +14,9 @@ class CustomDomains(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://%s/api/v2/custom-domains' % self.domain diff --git a/auth0/v3/management/device_credentials.py b/auth0/v3/management/device_credentials.py index 516a70ac..1624f454 100644 --- a/auth0/v3/management/device_credentials.py +++ b/auth0/v3/management/device_credentials.py @@ -14,9 +14,9 @@ class DeviceCredentials(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/device-credentials'.format(self.domain) diff --git a/auth0/v3/management/email_templates.py b/auth0/v3/management/email_templates.py index 365b4d98..cec5907c 100644 --- a/auth0/v3/management/email_templates.py +++ b/auth0/v3/management/email_templates.py @@ -14,9 +14,9 @@ class EmailTemplates(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/email-templates'.format(self.domain) diff --git a/auth0/v3/management/emails.py b/auth0/v3/management/emails.py index e709846b..ba39cd3f 100644 --- a/auth0/v3/management/emails.py +++ b/auth0/v3/management/emails.py @@ -14,9 +14,9 @@ class Emails(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/emails/provider'.format(self.domain) diff --git a/auth0/v3/management/grants.py b/auth0/v3/management/grants.py index da3b332a..7e4b0ccb 100644 --- a/auth0/v3/management/grants.py +++ b/auth0/v3/management/grants.py @@ -14,9 +14,9 @@ class Grants(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://%s/api/v2/grants' % self.domain diff --git a/auth0/v3/management/guardian.py b/auth0/v3/management/guardian.py index e421b4b7..eed73fe1 100644 --- a/auth0/v3/management/guardian.py +++ b/auth0/v3/management/guardian.py @@ -14,9 +14,9 @@ class Guardian(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/guardian'.format(self.domain) diff --git a/auth0/v3/management/jobs.py b/auth0/v3/management/jobs.py index 9d8864b3..95334420 100644 --- a/auth0/v3/management/jobs.py +++ b/auth0/v3/management/jobs.py @@ -14,9 +14,9 @@ class Jobs(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, path=None): url = 'https://{}/api/v2/jobs'.format(self.domain) diff --git a/auth0/v3/management/logs.py b/auth0/v3/management/logs.py index d7b70288..f200a37e 100644 --- a/auth0/v3/management/logs.py +++ b/auth0/v3/management/logs.py @@ -14,9 +14,9 @@ class Logs(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/logs'.format(self.domain) diff --git a/auth0/v3/management/resource_servers.py b/auth0/v3/management/resource_servers.py index 90a6be7b..7a110973 100644 --- a/auth0/v3/management/resource_servers.py +++ b/auth0/v3/management/resource_servers.py @@ -14,9 +14,9 @@ class ResourceServers(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/resource-servers'.format(self.domain) diff --git a/auth0/v3/management/rest.py b/auth0/v3/management/rest.py index 013a1d63..a8c90d78 100644 --- a/auth0/v3/management/rest.py +++ b/auth0/v3/management/rest.py @@ -13,8 +13,9 @@ class RestClient(object): """Provides simple methods for handling all RESTful api endpoints. """ - def __init__(self, jwt, telemetry=True): + def __init__(self, jwt, telemetry=True, timeout=5.0): self.jwt = jwt + self.timeout = timeout self.base_headers = { 'Authorization': 'Bearer {}'.format(self.jwt), @@ -40,38 +41,38 @@ def __init__(self, jwt, telemetry=True): def get(self, url, params=None): headers = self.base_headers.copy() - response = requests.get(url, params=params, headers=headers) + response = requests.get(url, params=params, headers=headers, timeout=self.timeout) return self._process_response(response) def post(self, url, data=None): headers = self.base_headers.copy() - response = requests.post(url, json=data, headers=headers) + response = requests.post(url, json=data, headers=headers, timeout=self.timeout) return self._process_response(response) def file_post(self, url, data=None, files=None): headers = self.base_headers.copy() headers.pop('Content-Type', None) - response = requests.post(url, data=data, files=files, headers=headers) + response = requests.post(url, data=data, files=files, headers=headers, timeout=self.timeout) return self._process_response(response) def patch(self, url, data=None): headers = self.base_headers.copy() - response = requests.patch(url, json=data, headers=headers) + response = requests.patch(url, json=data, headers=headers, timeout=self.timeout) return self._process_response(response) def put(self, url, data=None): headers = self.base_headers.copy() - response = requests.put(url, json=data, headers=headers) + response = requests.put(url, json=data, headers=headers, timeout=self.timeout) return self._process_response(response) def delete(self, url, params=None, data=None): headers = self.base_headers.copy() - response = requests.delete(url, headers=headers, params=params or {}, json=data) + response = requests.delete(url, headers=headers, params=params or {}, json=data, timeout=self.timeout) return self._process_response(response) def _process_response(self, response): diff --git a/auth0/v3/management/roles.py b/auth0/v3/management/roles.py index 0503d8ed..0ba703ee 100644 --- a/auth0/v3/management/roles.py +++ b/auth0/v3/management/roles.py @@ -14,9 +14,9 @@ class Roles(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/roles'.format(self.domain) diff --git a/auth0/v3/management/rules.py b/auth0/v3/management/rules.py index 5838a65d..5146851b 100644 --- a/auth0/v3/management/rules.py +++ b/auth0/v3/management/rules.py @@ -14,9 +14,9 @@ class Rules(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/rules'.format(self.domain) diff --git a/auth0/v3/management/rules_configs.py b/auth0/v3/management/rules_configs.py index 686f1013..cd935e69 100644 --- a/auth0/v3/management/rules_configs.py +++ b/auth0/v3/management/rules_configs.py @@ -14,9 +14,9 @@ class RulesConfigs(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://%s/api/v2/rules-configs' % self.domain diff --git a/auth0/v3/management/stats.py b/auth0/v3/management/stats.py index a03507d6..d6f223da 100644 --- a/auth0/v3/management/stats.py +++ b/auth0/v3/management/stats.py @@ -13,9 +13,9 @@ class Stats(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, action): return 'https://{}/api/v2/stats/{}'.format(self.domain, action) diff --git a/auth0/v3/management/tenants.py b/auth0/v3/management/tenants.py index b1faef70..62d8efe4 100644 --- a/auth0/v3/management/tenants.py +++ b/auth0/v3/management/tenants.py @@ -14,9 +14,9 @@ class Tenants(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self): return 'https://{}/api/v2/tenants/settings'.format(self.domain) diff --git a/auth0/v3/management/tickets.py b/auth0/v3/management/tickets.py index bffd9f53..b62e86ff 100644 --- a/auth0/v3/management/tickets.py +++ b/auth0/v3/management/tickets.py @@ -14,9 +14,9 @@ class Tickets(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, action): return 'https://{}/api/v2/tickets/{}'.format(self.domain, action) diff --git a/auth0/v3/management/user_blocks.py b/auth0/v3/management/user_blocks.py index 82af8e51..8712d863 100644 --- a/auth0/v3/management/user_blocks.py +++ b/auth0/v3/management/user_blocks.py @@ -14,9 +14,9 @@ class UserBlocks(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/user-blocks'.format(self.domain) diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index 79514e09..45b71648 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -14,9 +14,9 @@ class Users(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/users'.format(self.domain) diff --git a/auth0/v3/management/users_by_email.py b/auth0/v3/management/users_by_email.py index c9f582e7..8993e378 100644 --- a/auth0/v3/management/users_by_email.py +++ b/auth0/v3/management/users_by_email.py @@ -14,9 +14,9 @@ class UsersByEmail(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self): url = 'https://{}/api/v2/users-by-email'.format(self.domain) diff --git a/auth0/v3/test/authentication/test_base.py b/auth0/v3/test/authentication/test_base.py index 804c4593..5d9cde01 100644 --- a/auth0/v3/test/authentication/test_base.py +++ b/auth0/v3/test/authentication/test_base.py @@ -51,7 +51,7 @@ def test_post(self, mock_post): data = ab.post('the-url', data={'a': 'b'}, headers={'c': 'd'}) mock_post.assert_called_with(url='the-url', json={'a': 'b'}, - headers={'c': 'd', 'Content-Type': 'application/json'}) + headers={'c': 'd', 'Content-Type': 'application/json'}, timeout=5.0) self.assertEqual(data, {'x': 'y'}) @@ -66,7 +66,7 @@ def test_post_with_defaults(self, mock_post): data = ab.post('the-url') mock_post.assert_called_with(url='the-url', json=None, - headers={'Content-Type': 'application/json'}) + headers={'Content-Type': 'application/json'}, timeout=5.0) self.assertEqual(data, {'x': 'y'}) @@ -182,7 +182,7 @@ def test_get(self, mock_get): data = ab.get('the-url', params={'a': 'b'}, headers={'c': 'd'}) mock_get.assert_called_with(url='the-url', params={'a': 'b'}, - headers={'c': 'd', 'Content-Type': 'application/json'}) + headers={'c': 'd', 'Content-Type': 'application/json'}, timeout=5.0) self.assertEqual(data, {'x': 'y'}) @@ -197,7 +197,7 @@ def test_get_with_defaults(self, mock_get): data = ab.get('the-url') mock_get.assert_called_with(url='the-url', params=None, - headers={'Content-Type': 'application/json'}) + headers={'Content-Type': 'application/json'}, timeout=5.0) self.assertEqual(data, {'x': 'y'}) @@ -221,3 +221,15 @@ def test_get_includes_telemetry(self, mock_get): self.assertIn('Auth0-Client', headers) self.assertEqual(data, {"x": "y"}) + + def test_get_can_timeout(self): + ab = AuthenticationBase('auth0.com', timeout=0.00001) + + with self.assertRaises(requests.exceptions.Timeout): + ab.get('https://auth0.com', params={'a': 'b'}, headers={'c': 'd'}) + + def test_post_can_timeout(self): + ab = AuthenticationBase('auth0.com', timeout=0.00001) + + with self.assertRaises(requests.exceptions.Timeout): + ab.post('https://auth0.com', data={'a': 'b'}, headers={'c': 'd'}) diff --git a/auth0/v3/test/management/test_rest.py b/auth0/v3/test/management/test_rest.py index 5a773179..16b0cf6a 100644 --- a/auth0/v3/test/management/test_rest.py +++ b/auth0/v3/test/management/test_rest.py @@ -22,14 +22,14 @@ def test_get(self, mock_get): mock_get.return_value.status_code = 200 response = rc.get('the-url') - mock_get.assert_called_with('the-url', params=None, headers=headers) + mock_get.assert_called_with('the-url', params=None, headers=headers, timeout=5.0) self.assertEqual(response, ['a', 'b']) response = rc.get(url='the/url', params={'A': 'param', 'B': 'param'}) mock_get.assert_called_with('the/url', params={'A': 'param', 'B': 'param'}, - headers=headers) + headers=headers, timeout=5.0) self.assertEqual(response, ['a', 'b']) mock_get.return_value.text = '' @@ -65,7 +65,7 @@ def test_post(self, mock_post): mock_post.return_value.status_code = 200 response = rc.post('the/url', data=data) mock_post.assert_called_with('the/url', json=data, - headers=headers) + headers=headers, timeout=5.0) self.assertEqual(response, {'a': 'b'}) @@ -213,7 +213,7 @@ def test_file_post_content_type_is_none(self, mock_post): rc.file_post('the-url', data=data, files=files) - mock_post.assert_called_once_with('the-url', data=data, files=files, headers=headers) + mock_post.assert_called_once_with('the-url', data=data, files=files, headers=headers, timeout=5.0) @mock.patch('requests.put') @@ -229,7 +229,7 @@ def test_put(self, mock_put): response = rc.put(url='the-url', data=data) mock_put.assert_called_with('the-url', json=data, - headers=headers) + headers=headers, timeout=5.0) self.assertEqual(response, ['a', 'b']) @@ -262,7 +262,7 @@ def test_patch(self, mock_patch): response = rc.patch(url='the-url', data=data) mock_patch.assert_called_with('the-url', json=data, - headers=headers) + headers=headers, timeout=5.0) self.assertEqual(response, ['a', 'b']) @@ -294,7 +294,7 @@ def test_delete(self, mock_delete): mock_delete.return_value.status_code = 200 response = rc.delete(url='the-url/ID') - mock_delete.assert_called_with('the-url/ID', headers=headers, params={}, json=None) + mock_delete.assert_called_with('the-url/ID', headers=headers, params={}, json=None, timeout=5.0) self.assertEqual(response, ['a', 'b']) @@ -313,7 +313,7 @@ def test_delete_with_body_and_params(self, mock_delete): params={'A': 'param', 'B': 'param'} response = rc.delete(url='the-url/ID', params=params, data=data) - mock_delete.assert_called_with('the-url/ID', headers=headers, params=params, json=data) + mock_delete.assert_called_with('the-url/ID', headers=headers, params=params, json=data, timeout=5.0) self.assertEqual(response, ['a', 'b'])