Skip to content

Commit

Permalink
Merge 780fec0 into 6efa3ec
Browse files Browse the repository at this point in the history
  • Loading branch information
congminh1254 committed Jul 27, 2023
2 parents 6efa3ec + 780fec0 commit 97f824d
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 10 deletions.
35 changes: 27 additions & 8 deletions boxsdk/session/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,15 +279,29 @@ def _raise_on_unsuccessful_request(network_response: 'NetworkResponse', request:
context_info=response_json.get('context_info', None),
network_response=network_response
)

@staticmethod
def _validate_json_response(network_response: 'NetworkResponse', request: '_BoxRequest', throw_exception=False) -> 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):
raise BoxAPIException(
status=network_response.status_code,
headers=network_response.headers,
message='Non-json response received, while expecting json response.',
url=request.url,
method=request.method,
network_response=network_response,
)
if throw_exception:
raise BoxAPIException(
status=network_response.status_code,
headers=network_response.headers,
message='Non-json response received, while expecting json response.',
url=request.url,
method=request.method,
network_response=network_response,
)
return False
return True

def _prepare_and_send_request(
self,
Expand Down Expand Up @@ -360,6 +374,7 @@ def _prepare_and_send_request(
network_response = retry(request, **kwargs)

self._raise_on_unsuccessful_request(network_response, request, raised_exception)
self._validate_json_response(network_response, request, True)

return network_response

Expand Down Expand Up @@ -541,6 +556,10 @@ def _get_retry_request_callable(
self._renew_session(request.access_token)
request.auto_session_renewal = False
return self._send_request

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

return super()._get_retry_request_callable(
network_response,
attempt_number,
Expand Down
15 changes: 13 additions & 2 deletions test/unit/session/test_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,12 +221,23 @@ 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]

API.MAX_RETRY_ATTEMPTS = 1
box_session.get(url=test_url)
API.MAX_RETRY_ATTEMPTS = 5


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
mock_network_layer.request.side_effect = [non_json_response, 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 97f824d

Please sign in to comment.