photon: return api error on invalid photon responses (#76191)
gitea/passerelle/pipeline/head This commit looks good Details

This commit is contained in:
Frédéric Péters 2023-04-03 21:29:55 +02:00
parent aa24d04fbb
commit 8f707e90cb
2 changed files with 27 additions and 4 deletions

View File

@ -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)

View File

@ -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')"