Skip to content

Commit 1e81110

Browse files
function for checking responses for errors
1 parent 07f6d02 commit 1e81110

File tree

5 files changed

+44
-29
lines changed

5 files changed

+44
-29
lines changed

geoengine/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from .auth import Session, get_session, initialize, reset
44
from .error import GeoEngineException, InputException, UninitializedException, TypeException, \
55
MethodNotCalledOnPlotException, MethodNotCalledOnRasterException, MethodNotCalledOnVectorException, \
6-
SpatialReferenceMismatchException
6+
SpatialReferenceMismatchException, check_response_for_error
77
from .types import QueryRectangle
88
from .workflow import WorkflowId, Workflow, workflow_by_id, register_workflow
99
from .datasets import upload_dataframe, StoredDataset

geoengine/error.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
from typing import Dict
66

7+
from requests import Response, HTTPError
8+
79

810
class GeoEngineException(Exception):
911
'''
@@ -107,3 +109,28 @@ def __init__(self, spatial_reference_a: str, spatial_reference_b: str) -> None:
107109

108110
def __str__(self) -> str:
109111
return f"Spatial reference mismatch {self.__spatial_reference_a} != {self.__spatial_reference_b}"
112+
113+
114+
def check_response_for_error(response: Response):
115+
'''
116+
Checks a `Response` for an error and raises it if there is one.
117+
'''
118+
119+
try:
120+
response.raise_for_status()
121+
122+
return # no error
123+
except HTTPError as http_error:
124+
exception = http_error
125+
126+
# try to parse it as a Geo Engine error
127+
try:
128+
response_json = response.json()
129+
if 'error' in response_json:
130+
# override exception with `GeoEngineException`
131+
exception = GeoEngineException(response_json)
132+
except Exception: # pylint: disable=broad-except
133+
pass # ignore errors, it seemed not to be JSON
134+
135+
# either raise the `GeoEngineException` or any other `HTTPError`
136+
raise exception

geoengine/workflow.py

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from geoengine.types import InternalDatasetId, ProvenanceOutput, QueryRectangle, ResultDescriptor
2727
from geoengine.auth import get_session
2828
from geoengine.error import GeoEngineException, MethodNotCalledOnPlotException, MethodNotCalledOnRasterException, \
29-
MethodNotCalledOnVectorException, SpatialReferenceMismatchException
29+
MethodNotCalledOnVectorException, SpatialReferenceMismatchException, check_response_for_error
3030
from geoengine.datasets import StoredDataset, UploadId
3131

3232

@@ -164,10 +164,10 @@ def get_dataframe(self, bbox: QueryRectangle) -> gpd.GeoDataFrame:
164164
wfs_url = self.__get_wfs_url(bbox)
165165

166166
data_response = req.get(wfs_url, headers=session.auth_header)
167-
data = data_response.json()
168167

169-
if 'error' in data:
170-
raise GeoEngineException(data)
168+
check_response_for_error(data_response)
169+
170+
data = data_response.json()
171171

172172
def geo_json_with_time_to_geopandas(geo_json):
173173
'''
@@ -249,23 +249,9 @@ def wms_get_map_as_image(self, bbox: QueryRectangle, colorizer_min_max: Tuple[fl
249249
wms_request = self.__wms_get_map_request(bbox, colorizer_min_max)
250250
response = req.Session().send(wms_request)
251251

252-
try:
253-
image = Image.open(BytesIO(response.content))
254-
return image
255-
except Exception as pil_exception: # pylint: disable=broad-except
256-
exception = pil_exception
252+
check_response_for_error(response)
257253

258-
# try to parse it as a Geo Engine error
259-
try:
260-
response_json = response.json()
261-
if 'error' in response_json:
262-
# override exception with `GeoEngineException`
263-
exception = GeoEngineException(response_json)
264-
except Exception: # pylint: disable=broad-except
265-
pass # ignore errors, it seemed not to be JSON
266-
267-
# we either raise the Geo Engine exception or the PIL exception
268-
raise exception
254+
return Image.open(BytesIO(response.content))
269255

270256
def __wms_get_map_request(self,
271257
bbox: QueryRectangle,
@@ -342,10 +328,11 @@ def plot_chart(self, bbox: QueryRectangle) -> VegaLite:
342328

343329
plot_url = f'{session.server_url}/plot/{self}?bbox={spatial_bounds}&time={time}&spatialResolution={resolution}'
344330

345-
response = req.get(plot_url, headers=session.auth_header).json()
331+
response = req.get(plot_url, headers=session.auth_header)
346332

347-
if 'error' in response:
348-
raise GeoEngineException(response)
333+
check_response_for_error(response)
334+
335+
response = response.json()
349336

350337
vega_spec = json.loads(response['data']['vegaString'])
351338

@@ -430,10 +417,11 @@ def save_as_dataset(self, bbox: QueryRectangle, name: str, description: str = ''
430417
url=f'{session.server_url}/datasetFromWorkflow/{self.__workflow_id}',
431418
json=request_body,
432419
headers=session.auth_header,
433-
).json()
420+
)
434421

435-
if 'error' in response:
436-
raise GeoEngineException(response)
422+
check_response_for_error(response)
423+
424+
response = response.json()
437425

438426
return StoredDataset(
439427
dataset_id=InternalDatasetId.from_response(response['dataset']),

tests/test_wfs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ def test_wfs_error(self):
439439
},
440440
request_headers={'Authorization': 'Bearer e327d9c3-a4f3-4bd7-a5e1-30b26cae8064'})
441441

442-
m.get('http://mock-instance/wfs',
442+
m.get('http://mock-instance/wfs/956d3656-2d14-5951-96a0-f962b92371cd',
443443
json={
444444
"error": "Operator",
445445
"message": 'Operator: Could not open gdal dataset for file path '

tests/test_wms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ def test_image_error(self):
213213
# Unfortunately, we need a separate library to catch the request from the WMS call
214214
m.get(
215215
# pylint: disable=line-too-long
216-
'http://mock-instance/wms?service=WMS&version=1.3.0&request=GetMap&layers=5b9508a8-bd34-5a1c-acd6-75bb832d2d38&time=2004-04-01T12%3A00%3A00.000%2B00%3A00&crs=EPSG%3A4326&bbox=-90.0%2C-180.0%2C90.0%2C180.0&width=200&height=100&format=image%2Fpng&styles=custom%3A%7B%22type%22%3A+%22linearGradient%22%2C+%22breakpoints%22%3A+%5B%7B%22value%22%3A+0%2C+%22color%22%3A+%5B0%2C+0%2C+0%2C+255%5D%7D%2C+%7B%22value%22%3A+255%2C+%22color%22%3A+%5B255%2C+255%2C+255%2C+255%5D%7D%5D%2C+%22noDataColor%22%3A+%5B0%2C+0%2C+0%2C+0%5D%2C+%22defaultColor%22%3A+%5B0%2C+0%2C+0%2C+0%5D%7D',
216+
'http://mock-instance/wms/5b9508a8-bd34-5a1c-acd6-75bb832d2d38?service=WMS&version=1.3.0&request=GetMap&layers=5b9508a8-bd34-5a1c-acd6-75bb832d2d38&time=2004-04-01T12%3A00%3A00.000%2B00%3A00&crs=EPSG%3A4326&bbox=-90.0%2C-180.0%2C90.0%2C180.0&width=200&height=100&format=image%2Fpng&styles=custom%3A%7B%22type%22%3A+%22linearGradient%22%2C+%22breakpoints%22%3A+%5B%7B%22value%22%3A+0%2C+%22color%22%3A+%5B0%2C+0%2C+0%2C+255%5D%7D%2C+%7B%22value%22%3A+255%2C+%22color%22%3A+%5B255%2C+255%2C+255%2C+255%5D%7D%5D%2C+%22noDataColor%22%3A+%5B0%2C+0%2C+0%2C+0%5D%2C+%22defaultColor%22%3A+%5B0%2C+0%2C+0%2C+0%5D%7D',
217217
json={
218218
"error": "Operator",
219219
"message": 'Operator: Could not open gdal dataset for file path '

0 commit comments

Comments
 (0)