diff --git a/passerelle/apps/photon/models.py b/passerelle/apps/photon/models.py index d2eb1767..32d9d995 100644 --- a/passerelle/apps/photon/models.py +++ b/passerelle/apps/photon/models.py @@ -149,9 +149,13 @@ class Photon(BaseResource): except RequestException as e: raise APIError('failed to get %s: %s' % (url, e)) - result = [] + try: + response_json = result_response.json() + except ValueError: + raise APIError('invalid photon response (%r)' % result_response.content[:1024]) - for feature in result_response.json().get('features'): + result = [] + for feature in response_json.get('features'): if not feature['geometry']['type'] == 'Point': continue # skip unknown if zipcode and feature['properties'].get('postcode') != zipcode: @@ -207,9 +211,14 @@ class Photon(BaseResource): result_response.raise_for_status() except RequestException as e: raise APIError('failed to get %s: %s' % (url, e)) - result = None - for feature in result_response.json().get('features'): + try: + response_json = result_response.json() + except ValueError: + raise APIError('invalid photon response (%r)' % result_response.content[:1024]) + + result = None + for feature in response_json.get('features'): if not feature['geometry']['type'] == 'Point': continue # skip unknown result = self.format_address_data(feature) diff --git a/tests/test_photon.py b/tests/test_photon.py index f5d1ea94..3d943c01 100644 --- a/tests/test_photon.py +++ b/tests/test_photon.py @@ -319,3 +319,17 @@ def test_photon_reverse_cache(app, photon, freezer, mock_photon_reverse, mock_ph resp = app.get('/photon/%s/reverse?lon=4.8522272&lat=45.7587414' % photon.slug) assert mock_photon_reverse.call['count'] == 2 assert AddressCacheModel.objects.get().timestamp > first_timestamp + + +@mock.patch('passerelle.utils.Request.get') +def test_photon_non_json(mocked_get, app, photon): + response = tests.utils.FakedResponse(content=b'xxx', status_code=200) + mocked_get.return_value = response + + resp = app.get('/photon/%s/search' % photon.slug, params={'q': 'plop'}, status=200) + assert resp.json['err'] == 1 + assert resp.json['err_desc'] == "invalid photon response (b'xxx')" + + resp = app.get('/photon/%s/reverse' % photon.slug, params={'lat': '0', 'lon': '0'}, status=200) + assert resp.json['err'] == 1 + assert resp.json['err_desc'] == "invalid photon response (b'xxx')"