opengis: fix features endpoint with bad json response (#78901)
gitea/passerelle/pipeline/head Build queued... Details

This commit is contained in:
Lauréline Guérin 2023-06-22 15:55:31 +02:00
parent 002af7c243
commit 468e5309a9
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 34 additions and 2 deletions

View File

@ -215,12 +215,16 @@ class OpenGIS(BaseResource):
response = self.requests.get(self.wfs_service_url, params=params)
data = []
try:
response = response.json()
json_response = response.json()
except ValueError:
self.handle_opengis_error(response)
# if handle_opengis_error did not raise an error, we raise a generic one
raise APIError('OpenGIS Error: unparsable error', data={'content': repr(response.content[:1024])})
for feature in response['features']:
if not isinstance(json_response, dict) or 'features' not in json_response:
raise APIError(
'OpenGIS Error: bad result format', data={'content': repr(response.content[:1024])}
)
for feature in json_response['features']:
feature['text'] = feature['properties'].get(property_name)
data.append(feature)
return {'data': data}

View File

@ -585,6 +585,34 @@ def test_get_feature_error2(mocked_get, app, connector):
assert '<ows:' in result['data']['content']
@mock.patch('passerelle.utils.Request.get')
def test_get_feature_bad_result(mocked_get, app, connector):
def keyerror(url, **kwargs):
if kwargs['params'].get('request') == 'GetCapabilities':
assert kwargs['params'].get('service')
return tests.utils.FakedResponse(status_code=200, content=FAKE_SERVICE_CAPABILITIES)
return tests.utils.FakedResponse(status_code=200, content=json.dumps({}))
endpoint = tests.utils.generic_endpoint_url('opengis', 'features', slug=connector.slug)
mocked_get.side_effect = keyerror
resp = app.get(endpoint, params={'type_names': 'ref_metro_limites_communales', 'property_name': 'nom'})
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'OpenGIS Error: bad result format'
assert resp.json['data'] == {'content': "'{}'"}
def typeerror(url, **kwargs):
if kwargs['params'].get('request') == 'GetCapabilities':
assert kwargs['params'].get('service')
return tests.utils.FakedResponse(status_code=200, content=FAKE_SERVICE_CAPABILITIES)
return tests.utils.FakedResponse(status_code=200, content=json.dumps([]))
mocked_get.side_effect = typeerror
resp = app.get(endpoint, params={'type_names': 'ref_metro_limites_communales', 'property_name': 'nom'})
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'OpenGIS Error: bad result format'
assert resp.json['data'] == {'content': "'[]'"}
@pytest.mark.parametrize(
"server_responses, version, typename_label",
[(geoserver_responses_v1_0_0, '1.0.0', 'typename'), (geoserver_responses, '2.0.0', 'typenames')],