Skip to content

Commit

Permalink
Merge cd97b30 into 6efa3ec
Browse files Browse the repository at this point in the history
  • Loading branch information
congminh1254 committed Jul 28, 2023
2 parents 6efa3ec + cd97b30 commit 262f6f0
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 3 deletions.
22 changes: 21 additions & 1 deletion boxsdk/session/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,8 @@ def _raise_on_unsuccessful_request(network_response: 'NetworkResponse', request:
context_info=response_json.get('context_info', None),
network_response=network_response
)
if request.expect_json_response and not is_json_response(network_response):

if not Session._validate_json_response(network_response, request):
raise BoxAPIException(
status=network_response.status_code,
headers=network_response.headers,
Expand All @@ -289,6 +290,20 @@ def _raise_on_unsuccessful_request(network_response: 'NetworkResponse', request:
network_response=network_response,
)

@staticmethod
def _validate_json_response(network_response: 'NetworkResponse', request: '_BoxRequest') -> bool:
"""
Validate that the response is json if the request expects json response.
:param network_response:
The network response which is being tested for success.
:param request:
The API request that could be unsuccessful.
"""
if request.expect_json_response and not is_json_response(network_response):
return False
return True

def _prepare_and_send_request(
self,
method: str,
Expand Down Expand Up @@ -398,6 +413,10 @@ def _get_retry_request_callable(
self._send_request,
)
code = network_response.status_code

if request.method == 'GET' and network_response and network_response.ok and not self._validate_json_response(network_response, request):
return self._send_request

if (code in (202, 429) or code >= 500) and code not in skip_retry_codes and not self._is_server_auth_type(kwargs):
return partial(
self._network_layer.retry_after,
Expand Down Expand Up @@ -541,6 +560,7 @@ def _get_retry_request_callable(
self._renew_session(request.access_token)
request.auto_session_renewal = False
return self._send_request

return super()._get_retry_request_callable(
network_response,
attempt_number,
Expand Down
13 changes: 11 additions & 2 deletions test/unit/session/test_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,12 +221,21 @@ def test_box_session_seeks_file_after_retry(box_session, mock_network_layer, ser
assert mock_file_2.seek.has_calls(call(3) * 2)


def test_box_session_raises_for_non_json_response(box_session, mock_network_layer, non_json_response, test_url):
def test_box_session_raises_for_non_json_response(box_session, mock_network_layer, non_json_response, generic_successful_response, test_url):
# pylint:disable=redefined-outer-name
mock_network_layer.request.side_effect = [non_json_response]
mock_network_layer.request.side_effect = [non_json_response, generic_successful_response]

box_session.get(url=test_url)


def test_box_session_raises_for_non_json_response_after_retry(box_session, mock_network_layer, non_json_response, test_url):
# pylint:disable=redefined-outer-name
API.MAX_RETRY_ATTEMPTS = 1
mock_network_layer.request.side_effect = [non_json_response] * (API.MAX_RETRY_ATTEMPTS + 1)

with pytest.raises(BoxAPIException):
box_session.get(url=test_url)
API.MAX_RETRY_ATTEMPTS = 5


def test_box_session_raises_for_failed_response(box_session, mock_network_layer, bad_network_response, test_url):
Expand Down

0 comments on commit 262f6f0

Please sign in to comment.