Skip to content

Commit 205997d

Browse files
authored
fix: Retry CCG and JWT auth requests on connection reset error (#790)
Closes: SDK-2886 Fixes: #789
1 parent 028ce87 commit 205997d

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

boxsdk/session/session.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -387,16 +387,14 @@ def _get_retry_request_callable(
387387
Callable that, when called, will retry the request. Takes the same parameters as :meth:`_send_request`.
388388
"""
389389
# pylint:disable=unused-argument
390-
if self._is_server_auth_type(kwargs):
391-
return None
392390
if network_response is None:
393391
return partial(
394392
self._network_layer.retry_after,
395393
self.get_retry_after_time(attempt_number, None),
396394
self._send_request,
397395
)
398396
code = network_response.status_code
399-
if (code in (202, 429) or code >= 500) and code not in skip_retry_codes:
397+
if (code in (202, 429) or code >= 500) and code not in skip_retry_codes and not self._is_server_auth_type(kwargs):
400398
return partial(
401399
self._network_layer.retry_after,
402400
self.get_retry_after_time(attempt_number, network_response.headers.get('Retry-After', None)),

test/unit/session/test_session.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import pytest
88

9+
from boxsdk import CCGAuth
910
from boxsdk.auth.oauth2 import OAuth2
1011
from boxsdk.config import API, Proxy
1112
from boxsdk.exception import BoxAPIException, BoxException
@@ -50,6 +51,14 @@ def box_session(mock_oauth, mock_network_layer, translator):
5051
return AuthorizedSession(oauth=mock_oauth, network_layer=mock_network_layer, translator=translator)
5152

5253

54+
@pytest.fixture
55+
def ccg_auth(client_id, client_secret, mock_user_id, mock_enterprise_id, box_session) -> CCGAuth:
56+
# pylint:disable=protected-access
57+
auth = CCGAuth(client_id=client_id, client_secret=client_secret, user=mock_user_id, enterprise_id=mock_enterprise_id)
58+
auth._session = box_session
59+
return auth
60+
61+
5362
@pytest.mark.parametrize('test_method', [
5463
Session.get,
5564
Session.post,
@@ -230,6 +239,15 @@ def test_box_session_retries_connection_aborted_exception(box_session, mock_netw
230239
assert box_response.status_code == 200
231240

232241

242+
def test_box_session_retries_connection_aborted_exception_on_ccg_auth_call(successful_token_response, ccg_auth, mock_user_id, access_token):
243+
# pylint:disable=protected-access
244+
ccg_auth._session._network_layer.request.side_effect = [RequestsConnectionError('Connection aborted'), successful_token_response]
245+
ccg_auth._session._network_layer.retry_after.side_effect = lambda delay, request, *args, **kwargs: request(*args, **kwargs)
246+
247+
new_access_token = ccg_auth.authenticate_user(mock_user_id)
248+
assert new_access_token == access_token
249+
250+
233251
def test_box_session_retries_requests_library_exceptions_only_once(box_session, mock_network_layer, test_url, generic_successful_request_response):
234252
mock_network_layer.request.side_effect = [
235253
RequestException('Connection aborted'),

0 commit comments

Comments
 (0)