From 90d17a6ac9037b0474ef2ecc0483722717b7cb14 Mon Sep 17 00:00:00 2001 From: VIctor Alvarez Date: Sat, 8 Oct 2016 11:31:55 -0700 Subject: [PATCH 1/8] WIP --- fitbit/api.py | 29 +++++++++++++++-------------- fitbit_tests/test_exceptions.py | 12 ++++++------ 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/fitbit/api.py b/fitbit/api.py index d3f8bd5..5732c43 100644 --- a/fitbit/api.py +++ b/fitbit/api.py @@ -49,11 +49,16 @@ def __init__(self, client_id, client_secret, } self.oauth = OAuth2Session(client_id) - def _request(self, method, url, **kwargs): + def _make_oauth2_request(self, method, url, refresh=False, **kwargs): """ - A simple wrapper around requests. + Make an OAuth2 request. + + Pass refresh=True to refresh the existing token before making the request. """ - return self.session.request(method, url, **kwargs) + if refresh: + self.refresh_token() + auth = OAuth2(client_id=self.client_id, token=self.token) + return self.session.request(method, url, auth=auth, **kwargs) def make_request(self, url, data={}, method=None, **kwargs): """ @@ -65,24 +70,20 @@ def make_request(self, url, data={}, method=None, **kwargs): method = 'POST' if data else 'GET' try: - auth = OAuth2(client_id=self.client_id, token=self.token) - response = self._request(method, url, data=data, auth=auth, **kwargs) + response = self._make_oauth2_request(method, url, data=data) except (HTTPUnauthorized, TokenExpiredError) as e: - self.refresh_token() - auth = OAuth2(client_id=self.client_id, token=self.token) - response = self._request(method, url, data=data, auth=auth, **kwargs) + response = self._make_oauth2_request(method, url, refresh=True, data=data) # yet another token expiration check # (the above try/except only applies if the expired token was obtained # using the current instance of the class this is a a general case) if response.status_code == 401: - d = json.loads(response.content.decode('utf8')) + response_data = json.loads(response.content.decode('utf8')) + response_errors = response_data['errors'] try: - if(d['errors'][0]['errorType'] == 'expired_token' and - d['errors'][0]['message'].find('Access token expired:') == 0): - self.refresh_token() - auth = OAuth2(client_id=self.client_id, token=self.token) - response = self._request(method, url, data=data, auth=auth, **kwargs) + if (response_errors[0]['errorType'] == 'expired_token' and + response_errors[0]['message'].find('Access token expired:') == 0): + response = self._make_oauth2_request(method, url, refresh=True, data=data) except: pass diff --git a/fitbit_tests/test_exceptions.py b/fitbit_tests/test_exceptions.py index f656445..d34b5dc 100644 --- a/fitbit_tests/test_exceptions.py +++ b/fitbit_tests/test_exceptions.py @@ -28,7 +28,7 @@ def test_response_ok(self): r.content = b'{"normal": "resource"}' f = Fitbit(**self.client_kwargs) - f.client._request = lambda *args, **kwargs: r + f.client._make_oauth2_request = lambda *args, **kwargs: r f.user_profile_get() r.status_code = 202 @@ -47,7 +47,7 @@ def test_response_auth(self): r.content = b'{"normal": "resource"}' f = Fitbit(**self.client_kwargs) - f.client._request = lambda *args, **kwargs: r + f.client._make_oauth2_request = lambda *args, **kwargs: r self.assertRaises(exceptions.HTTPUnauthorized, f.user_profile_get) @@ -63,7 +63,7 @@ def test_response_error(self): self.client_kwargs['oauth2'] = True f = Fitbit(**self.client_kwargs) - f.client._request = lambda *args, **kwargs: r + f.client._make_oauth2_request = lambda *args, **kwargs: r r.status_code = 404 self.assertRaises(exceptions.HTTPNotFound, f.user_profile_get) @@ -86,7 +86,7 @@ def test_too_many_requests(self): r.headers = {'Retry-After': '10'} f = Fitbit(**self.client_kwargs) - f.client._request = lambda *args, **kwargs: r + f.client._make_oauth2_request = lambda *args, **kwargs: r r.status_code = 429 try: @@ -105,7 +105,7 @@ def test_serialization(self): r.content = b"iyam not jason" f = Fitbit(**self.client_kwargs) - f.client._request = lambda *args, **kwargs: r + f.client._make_oauth2_request = lambda *args, **kwargs: r self.assertRaises(exceptions.BadResponse, f.user_profile_get) def test_delete_error(self): @@ -117,5 +117,5 @@ def test_delete_error(self): r.content = b'{"it\'s all": "ok"}' f = Fitbit(**self.client_kwargs) - f.client._request = lambda *args, **kwargs: r + f.client._make_oauth2_request = lambda *args, **kwargs: r self.assertRaises(exceptions.DeleteError, f.delete_activities, 12345) From 37136baea8553076c7da461829766361637210b7 Mon Sep 17 00:00:00 2001 From: VIctor Alvarez Date: Sat, 8 Oct 2016 11:39:05 -0700 Subject: [PATCH 2/8] WIP --- fitbit/api.py | 4 ++-- fitbit_tests/test_auth.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fitbit/api.py b/fitbit/api.py index 5732c43..6b29f7c 100644 --- a/fitbit/api.py +++ b/fitbit/api.py @@ -72,7 +72,7 @@ def make_request(self, url, data={}, method=None, **kwargs): try: response = self._make_oauth2_request(method, url, data=data) except (HTTPUnauthorized, TokenExpiredError) as e: - response = self._make_oauth2_request(method, url, refresh=True, data=data) + response = self._make_oauth2_request(method, url, refresh=True, data=data, **kwargs) # yet another token expiration check # (the above try/except only applies if the expired token was obtained @@ -83,7 +83,7 @@ def make_request(self, url, data={}, method=None, **kwargs): try: if (response_errors[0]['errorType'] == 'expired_token' and response_errors[0]['message'].find('Access token expired:') == 0): - response = self._make_oauth2_request(method, url, refresh=True, data=data) + response = self._make_oauth2_request(method, url, refresh=True, data=data, **kwargs) except: pass diff --git a/fitbit_tests/test_auth.py b/fitbit_tests/test_auth.py index be1de74..aea3e7a 100644 --- a/fitbit_tests/test_auth.py +++ b/fitbit_tests/test_auth.py @@ -70,7 +70,7 @@ def test_auto_refresh_token_exception(self): kwargs['refresh_token'] = 'fake_refresh_token' fb = Fitbit(**kwargs) - with mock.patch.object(FitbitOauth2Client, '_request') as r: + with mock.patch.object(FitbitOauth2Client, '_make_oauth2_request') as r: r.side_effect = [ HTTPUnauthorized(fake_response(401, b'correct_response')), fake_response(200, 'correct_response') @@ -99,7 +99,7 @@ def test_auto_refresh_token_non_exception(self): kwargs['refresh_token'] = 'fake_refresh_token' fb = Fitbit(**kwargs) - with mock.patch.object(FitbitOauth2Client, '_request') as r: + with mock.patch.object(FitbitOauth2Client, '_make_oauth2_request') as r: r.side_effect = [ fake_response(401, b'{"errors": [{"message": "Access token expired: some_token_goes_here", "errorType": "expired_token", "fieldName": "access_token"}]}'), fake_response(200, 'correct_response') From 5cd3f64a24b4fd39cad41520ef0d129101abd13e Mon Sep 17 00:00:00 2001 From: VIctor Alvarez Date: Sat, 8 Oct 2016 11:39:30 -0700 Subject: [PATCH 3/8] WIP --- fitbit/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fitbit/api.py b/fitbit/api.py index 6b29f7c..1c4250e 100644 --- a/fitbit/api.py +++ b/fitbit/api.py @@ -70,7 +70,7 @@ def make_request(self, url, data={}, method=None, **kwargs): method = 'POST' if data else 'GET' try: - response = self._make_oauth2_request(method, url, data=data) + response = self._make_oauth2_request(method, url, data=data, **kwargs) except (HTTPUnauthorized, TokenExpiredError) as e: response = self._make_oauth2_request(method, url, refresh=True, data=data, **kwargs) From cbf80f7d121412438b0dc1892f120fa114d93d4a Mon Sep 17 00:00:00 2001 From: VIctor Alvarez Date: Sat, 8 Oct 2016 11:48:53 -0700 Subject: [PATCH 4/8] WIP --- fitbit/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fitbit/api.py b/fitbit/api.py index 1c4250e..1ef53e4 100644 --- a/fitbit/api.py +++ b/fitbit/api.py @@ -79,8 +79,8 @@ def make_request(self, url, data={}, method=None, **kwargs): # using the current instance of the class this is a a general case) if response.status_code == 401: response_data = json.loads(response.content.decode('utf8')) - response_errors = response_data['errors'] try: + response_errors = response_data['errors'] if (response_errors[0]['errorType'] == 'expired_token' and response_errors[0]['message'].find('Access token expired:') == 0): response = self._make_oauth2_request(method, url, refresh=True, data=data, **kwargs) From 41a024594ca73712dedf4d023930893594fc911d Mon Sep 17 00:00:00 2001 From: VIctor Alvarez Date: Sat, 8 Oct 2016 11:57:20 -0700 Subject: [PATCH 5/8] WIP --- fitbit/api.py | 11 +++++------ fitbit_tests/test_auth.py | 12 ++++++------ fitbit_tests/test_exceptions.py | 12 ++++++------ 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/fitbit/api.py b/fitbit/api.py index 1ef53e4..67ec55c 100644 --- a/fitbit/api.py +++ b/fitbit/api.py @@ -49,7 +49,7 @@ def __init__(self, client_id, client_secret, } self.oauth = OAuth2Session(client_id) - def _make_oauth2_request(self, method, url, refresh=False, **kwargs): + def _make_request(self, method, url, refresh=False, **kwargs): """ Make an OAuth2 request. @@ -57,8 +57,7 @@ def _make_oauth2_request(self, method, url, refresh=False, **kwargs): """ if refresh: self.refresh_token() - auth = OAuth2(client_id=self.client_id, token=self.token) - return self.session.request(method, url, auth=auth, **kwargs) + return self.session.request(method, url, auth=OAuth2(client_id=self.client_id, token=self.token), **kwargs) def make_request(self, url, data={}, method=None, **kwargs): """ @@ -70,9 +69,9 @@ def make_request(self, url, data={}, method=None, **kwargs): method = 'POST' if data else 'GET' try: - response = self._make_oauth2_request(method, url, data=data, **kwargs) + response = self._make_request(method, url, data=data, **kwargs) except (HTTPUnauthorized, TokenExpiredError) as e: - response = self._make_oauth2_request(method, url, refresh=True, data=data, **kwargs) + response = self._make_request(method, url, refresh=True, data=data, **kwargs) # yet another token expiration check # (the above try/except only applies if the expired token was obtained @@ -83,7 +82,7 @@ def make_request(self, url, data={}, method=None, **kwargs): response_errors = response_data['errors'] if (response_errors[0]['errorType'] == 'expired_token' and response_errors[0]['message'].find('Access token expired:') == 0): - response = self._make_oauth2_request(method, url, refresh=True, data=data, **kwargs) + response = self._make_request(method, url, refresh=True, data=data, **kwargs) except: pass diff --git a/fitbit_tests/test_auth.py b/fitbit_tests/test_auth.py index aea3e7a..bfe8c7e 100644 --- a/fitbit_tests/test_auth.py +++ b/fitbit_tests/test_auth.py @@ -62,15 +62,15 @@ def test_refresh_token(self): def test_auto_refresh_token_exception(self): """Test of auto_refresh with Unauthorized exception""" - # 1. first call to _request causes a HTTPUnauthorized + # 1. first call to _make_request causes a HTTPUnauthorized # 2. the token_refresh call is faked - # 3. the second call to _request returns a valid value + # 3. the second call to _make_request returns a valid value kwargs = self.client_kwargs kwargs['access_token'] = 'fake_access_token' kwargs['refresh_token'] = 'fake_refresh_token' fb = Fitbit(**kwargs) - with mock.patch.object(FitbitOauth2Client, '_make_oauth2_request') as r: + with mock.patch.object(FitbitOauth2Client, '_make_request') as r: r.side_effect = [ HTTPUnauthorized(fake_response(401, b'correct_response')), fake_response(200, 'correct_response') @@ -91,15 +91,15 @@ def test_auto_refresh_token_exception(self): def test_auto_refresh_token_non_exception(self): """Test of auto_refersh when the exception doesn't fire""" - # 1. first call to _request causes a 401 expired token response + # 1. first call to _make_request causes a 401 expired token response # 2. the token_refresh call is faked - # 3. the second call to _request returns a valid value + # 3. the second call to _make_request returns a valid value kwargs = self.client_kwargs kwargs['access_token'] = 'fake_access_token' kwargs['refresh_token'] = 'fake_refresh_token' fb = Fitbit(**kwargs) - with mock.patch.object(FitbitOauth2Client, '_make_oauth2_request') as r: + with mock.patch.object(FitbitOauth2Client, '_make_request') as r: r.side_effect = [ fake_response(401, b'{"errors": [{"message": "Access token expired: some_token_goes_here", "errorType": "expired_token", "fieldName": "access_token"}]}'), fake_response(200, 'correct_response') diff --git a/fitbit_tests/test_exceptions.py b/fitbit_tests/test_exceptions.py index d34b5dc..c797c5d 100644 --- a/fitbit_tests/test_exceptions.py +++ b/fitbit_tests/test_exceptions.py @@ -28,7 +28,7 @@ def test_response_ok(self): r.content = b'{"normal": "resource"}' f = Fitbit(**self.client_kwargs) - f.client._make_oauth2_request = lambda *args, **kwargs: r + f.client._make_request = lambda *args, **kwargs: r f.user_profile_get() r.status_code = 202 @@ -47,7 +47,7 @@ def test_response_auth(self): r.content = b'{"normal": "resource"}' f = Fitbit(**self.client_kwargs) - f.client._make_oauth2_request = lambda *args, **kwargs: r + f.client._make_request = lambda *args, **kwargs: r self.assertRaises(exceptions.HTTPUnauthorized, f.user_profile_get) @@ -63,7 +63,7 @@ def test_response_error(self): self.client_kwargs['oauth2'] = True f = Fitbit(**self.client_kwargs) - f.client._make_oauth2_request = lambda *args, **kwargs: r + f.client._make_request = lambda *args, **kwargs: r r.status_code = 404 self.assertRaises(exceptions.HTTPNotFound, f.user_profile_get) @@ -86,7 +86,7 @@ def test_too_many_requests(self): r.headers = {'Retry-After': '10'} f = Fitbit(**self.client_kwargs) - f.client._make_oauth2_request = lambda *args, **kwargs: r + f.client._make_request = lambda *args, **kwargs: r r.status_code = 429 try: @@ -105,7 +105,7 @@ def test_serialization(self): r.content = b"iyam not jason" f = Fitbit(**self.client_kwargs) - f.client._make_oauth2_request = lambda *args, **kwargs: r + f.client._make_request = lambda *args, **kwargs: r self.assertRaises(exceptions.BadResponse, f.user_profile_get) def test_delete_error(self): @@ -117,5 +117,5 @@ def test_delete_error(self): r.content = b'{"it\'s all": "ok"}' f = Fitbit(**self.client_kwargs) - f.client._make_oauth2_request = lambda *args, **kwargs: r + f.client._make_request = lambda *args, **kwargs: r self.assertRaises(exceptions.DeleteError, f.delete_activities, 12345) From 77d2409a1953a7e875caf33345335eb1073fedf3 Mon Sep 17 00:00:00 2001 From: VIctor Alvarez Date: Sat, 8 Oct 2016 12:02:19 -0700 Subject: [PATCH 6/8] WIP --- fitbit/api.py | 8 ++++---- fitbit_tests/test_auth.py | 12 ++++++------ fitbit_tests/test_exceptions.py | 12 ++++++------ 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/fitbit/api.py b/fitbit/api.py index 67ec55c..4af7a5e 100644 --- a/fitbit/api.py +++ b/fitbit/api.py @@ -49,7 +49,7 @@ def __init__(self, client_id, client_secret, } self.oauth = OAuth2Session(client_id) - def _make_request(self, method, url, refresh=False, **kwargs): + def _request(self, method, url, refresh=False, **kwargs): """ Make an OAuth2 request. @@ -69,9 +69,9 @@ def make_request(self, url, data={}, method=None, **kwargs): method = 'POST' if data else 'GET' try: - response = self._make_request(method, url, data=data, **kwargs) + response = self._request(method, url, data=data, **kwargs) except (HTTPUnauthorized, TokenExpiredError) as e: - response = self._make_request(method, url, refresh=True, data=data, **kwargs) + response = self._request(method, url, refresh=True, data=data, **kwargs) # yet another token expiration check # (the above try/except only applies if the expired token was obtained @@ -82,7 +82,7 @@ def make_request(self, url, data={}, method=None, **kwargs): response_errors = response_data['errors'] if (response_errors[0]['errorType'] == 'expired_token' and response_errors[0]['message'].find('Access token expired:') == 0): - response = self._make_request(method, url, refresh=True, data=data, **kwargs) + response = self._request(method, url, refresh=True, data=data, **kwargs) except: pass diff --git a/fitbit_tests/test_auth.py b/fitbit_tests/test_auth.py index bfe8c7e..be1de74 100644 --- a/fitbit_tests/test_auth.py +++ b/fitbit_tests/test_auth.py @@ -62,15 +62,15 @@ def test_refresh_token(self): def test_auto_refresh_token_exception(self): """Test of auto_refresh with Unauthorized exception""" - # 1. first call to _make_request causes a HTTPUnauthorized + # 1. first call to _request causes a HTTPUnauthorized # 2. the token_refresh call is faked - # 3. the second call to _make_request returns a valid value + # 3. the second call to _request returns a valid value kwargs = self.client_kwargs kwargs['access_token'] = 'fake_access_token' kwargs['refresh_token'] = 'fake_refresh_token' fb = Fitbit(**kwargs) - with mock.patch.object(FitbitOauth2Client, '_make_request') as r: + with mock.patch.object(FitbitOauth2Client, '_request') as r: r.side_effect = [ HTTPUnauthorized(fake_response(401, b'correct_response')), fake_response(200, 'correct_response') @@ -91,15 +91,15 @@ def test_auto_refresh_token_exception(self): def test_auto_refresh_token_non_exception(self): """Test of auto_refersh when the exception doesn't fire""" - # 1. first call to _make_request causes a 401 expired token response + # 1. first call to _request causes a 401 expired token response # 2. the token_refresh call is faked - # 3. the second call to _make_request returns a valid value + # 3. the second call to _request returns a valid value kwargs = self.client_kwargs kwargs['access_token'] = 'fake_access_token' kwargs['refresh_token'] = 'fake_refresh_token' fb = Fitbit(**kwargs) - with mock.patch.object(FitbitOauth2Client, '_make_request') as r: + with mock.patch.object(FitbitOauth2Client, '_request') as r: r.side_effect = [ fake_response(401, b'{"errors": [{"message": "Access token expired: some_token_goes_here", "errorType": "expired_token", "fieldName": "access_token"}]}'), fake_response(200, 'correct_response') diff --git a/fitbit_tests/test_exceptions.py b/fitbit_tests/test_exceptions.py index c797c5d..f656445 100644 --- a/fitbit_tests/test_exceptions.py +++ b/fitbit_tests/test_exceptions.py @@ -28,7 +28,7 @@ def test_response_ok(self): r.content = b'{"normal": "resource"}' f = Fitbit(**self.client_kwargs) - f.client._make_request = lambda *args, **kwargs: r + f.client._request = lambda *args, **kwargs: r f.user_profile_get() r.status_code = 202 @@ -47,7 +47,7 @@ def test_response_auth(self): r.content = b'{"normal": "resource"}' f = Fitbit(**self.client_kwargs) - f.client._make_request = lambda *args, **kwargs: r + f.client._request = lambda *args, **kwargs: r self.assertRaises(exceptions.HTTPUnauthorized, f.user_profile_get) @@ -63,7 +63,7 @@ def test_response_error(self): self.client_kwargs['oauth2'] = True f = Fitbit(**self.client_kwargs) - f.client._make_request = lambda *args, **kwargs: r + f.client._request = lambda *args, **kwargs: r r.status_code = 404 self.assertRaises(exceptions.HTTPNotFound, f.user_profile_get) @@ -86,7 +86,7 @@ def test_too_many_requests(self): r.headers = {'Retry-After': '10'} f = Fitbit(**self.client_kwargs) - f.client._make_request = lambda *args, **kwargs: r + f.client._request = lambda *args, **kwargs: r r.status_code = 429 try: @@ -105,7 +105,7 @@ def test_serialization(self): r.content = b"iyam not jason" f = Fitbit(**self.client_kwargs) - f.client._make_request = lambda *args, **kwargs: r + f.client._request = lambda *args, **kwargs: r self.assertRaises(exceptions.BadResponse, f.user_profile_get) def test_delete_error(self): @@ -117,5 +117,5 @@ def test_delete_error(self): r.content = b'{"it\'s all": "ok"}' f = Fitbit(**self.client_kwargs) - f.client._make_request = lambda *args, **kwargs: r + f.client._request = lambda *args, **kwargs: r self.assertRaises(exceptions.DeleteError, f.delete_activities, 12345) From 4bbfec52903b52205846645b84663c5aff255b90 Mon Sep 17 00:00:00 2001 From: VIctor Alvarez Date: Sat, 8 Oct 2016 12:26:07 -0700 Subject: [PATCH 7/8] WIP --- fitbit/api.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/fitbit/api.py b/fitbit/api.py index 4af7a5e..748b8ac 100644 --- a/fitbit/api.py +++ b/fitbit/api.py @@ -49,15 +49,12 @@ def __init__(self, client_id, client_secret, } self.oauth = OAuth2Session(client_id) - def _request(self, method, url, refresh=False, **kwargs): + def _request(self, method, url, **kwargs): """ - Make an OAuth2 request. - - Pass refresh=True to refresh the existing token before making the request. + A simple wrapper around requests. """ - if refresh: - self.refresh_token() - return self.session.request(method, url, auth=OAuth2(client_id=self.client_id, token=self.token), **kwargs) + return self.session.request( + method, url, auth=OAuth2(client_id=self.client_id, token=self.token), **kwargs) def make_request(self, url, data={}, method=None, **kwargs): """ @@ -71,7 +68,8 @@ def make_request(self, url, data={}, method=None, **kwargs): try: response = self._request(method, url, data=data, **kwargs) except (HTTPUnauthorized, TokenExpiredError) as e: - response = self._request(method, url, refresh=True, data=data, **kwargs) + self.refresh_token() + response = self._request(method, url, data=data, **kwargs) # yet another token expiration check # (the above try/except only applies if the expired token was obtained @@ -82,7 +80,8 @@ def make_request(self, url, data={}, method=None, **kwargs): response_errors = response_data['errors'] if (response_errors[0]['errorType'] == 'expired_token' and response_errors[0]['message'].find('Access token expired:') == 0): - response = self._request(method, url, refresh=True, data=data, **kwargs) + self.refresh_token() + response = self._request(method, url, data=data, **kwargs) except: pass From 92fda7150476908da1a187e1d32ec86534ea39c4 Mon Sep 17 00:00:00 2001 From: VIctor Alvarez Date: Sat, 8 Oct 2016 12:28:27 -0700 Subject: [PATCH 8/8] WIP --- fitbit/api.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/fitbit/api.py b/fitbit/api.py index 748b8ac..3f637f5 100644 --- a/fitbit/api.py +++ b/fitbit/api.py @@ -49,6 +49,10 @@ def __init__(self, client_id, client_secret, } self.oauth = OAuth2Session(client_id) + def _refresh_token_and_request(self, *args, **kwargs): + self.refresh_token() + return self._request(*args, **kwargs) + def _request(self, method, url, **kwargs): """ A simple wrapper around requests. @@ -68,8 +72,7 @@ def make_request(self, url, data={}, method=None, **kwargs): try: response = self._request(method, url, data=data, **kwargs) except (HTTPUnauthorized, TokenExpiredError) as e: - self.refresh_token() - response = self._request(method, url, data=data, **kwargs) + response = self._refresh_token_and_request(method, url, data=data, **kwargs) # yet another token expiration check # (the above try/except only applies if the expired token was obtained @@ -80,8 +83,7 @@ def make_request(self, url, data={}, method=None, **kwargs): response_errors = response_data['errors'] if (response_errors[0]['errorType'] == 'expired_token' and response_errors[0]['message'].find('Access token expired:') == 0): - self.refresh_token() - response = self._request(method, url, data=data, **kwargs) + response = self._refresh_token_and_request(method, url, data=data, **kwargs) except: pass