diff --git a/CHANGELOG.rst b/CHANGELOG.rst index f0fb15c..b59ecc0 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -17,6 +17,7 @@ This document describes changes between each past release. - Fix retry behaviour when responses are successful (fixes #129) - Fix Retry-After value to be read as integer rather than string. (#131) +- Fix No JSON could be decoded ValueError (fixes #116) **Internal changes** diff --git a/kinto_http/session.py b/kinto_http/session.py index b0fb2a5..d33f6a5 100644 --- a/kinto_http/session.py +++ b/kinto_http/session.py @@ -96,7 +96,11 @@ def request(self, method, endpoint, data=None, permissions=None, continue # Retries exhausted, raise expection. - message = '{0} - {1}'.format(resp.status_code, resp.json()) + try: + message = '{0} - {1}'.format(resp.status_code, resp.json()) + except ValueError: + # In case the response is not JSON, fallback to text. + message = '{0} - {1}'.format(resp.status_code, resp.text) exception = KintoException(message) exception.request = resp.request exception.response = resp diff --git a/kinto_http/tests/test_session.py b/kinto_http/tests/test_session.py index 75488ab..44e5b16 100644 --- a/kinto_http/tests/test_session.py +++ b/kinto_http/tests/test_session.py @@ -41,6 +41,17 @@ def test_bad_http_status_raises_exception(self): self.assertRaises(KintoException, session.request, 'get', '/test') + def test_bad_http_status_raises_exception_even_in_case_of_invalid_json_response(self): + response = fake_response(502) + response.json.side_effect = ValueError + response.text = "Foobar" + self.requests_mock.request.return_value = response + session = Session('https://example.org') + + with pytest.raises(KintoException) as e: + session.request('get', '/test') + self.assertEqual(e.value.message, "502 - Foobar") + def test_session_injects_auth_on_requests(self): response = fake_response(200) self.requests_mock.request.return_value = response