13
13
import pandas as pd
14
14
import requests
15
15
import shapely
16
- from requests import Session
16
+ from requests import Session , Response
17
17
from requests .adapters import HTTPAdapter
18
- from requests .exceptions import RetryError
18
+ from requests .exceptions import RetryError , JSONDecodeError
19
19
from urllib3 import Retry
20
20
21
21
from ohsome import OhsomeException , OhsomeResponse
@@ -332,37 +332,36 @@ def _handle_request(self) -> OhsomeResponse:
332
332
Handles request to ohsome API
333
333
:return:
334
334
"""
335
- ohsome_exception = None
336
- response = None
337
335
338
336
try :
339
- response = self ._session ().post (url = self ._url , data = self ._parameters )
340
- response .raise_for_status ()
341
- response .json ()
337
+ response = self ._post_request ()
338
+ self ._check_response (response )
339
+ data = self ._get_response_data (response )
340
+ except OhsomeException as ohsome_exception :
341
+ if self .log :
342
+ ohsome_exception .log (self .log_dir )
343
+ raise ohsome_exception
342
344
343
- except requests .exceptions .HTTPError as e :
344
- try :
345
- error_message = e .response .json ()["message" ]
346
- except json .decoder .JSONDecodeError :
347
- error_message = f"Invalid URL: Is { self ._url } valid?"
345
+ return OhsomeResponse (data = data , url = self ._url )
348
346
349
- ohsome_exception = OhsomeException (
350
- message = error_message ,
347
+ def _post_request (self ) -> Response :
348
+ try :
349
+ response = self ._session ().post (url = self ._url , data = self ._parameters )
350
+ except KeyboardInterrupt :
351
+ raise OhsomeException (
352
+ message = "Keyboard Interrupt: Query was interrupted by the user." ,
351
353
url = self ._url ,
352
354
params = self ._parameters ,
353
- error_code = e .response .status_code ,
354
- response = e .response ,
355
+ error_code = 440 ,
355
356
)
356
-
357
357
except requests .exceptions .ConnectionError as e :
358
- ohsome_exception = OhsomeException (
358
+ raise OhsomeException (
359
359
message = "Connection Error: Query could not be sent. Make sure there are no network "
360
360
f"problems and that the ohsome API URL { self ._url } is valid." ,
361
361
url = self ._url ,
362
362
params = self ._parameters ,
363
363
response = e .response ,
364
364
)
365
-
366
365
except requests .exceptions .RequestException as e :
367
366
if isinstance (e , RetryError ):
368
367
# retry one last time without retries, this will raise the original error instead of a cryptic retry
@@ -371,53 +370,57 @@ def _handle_request(self) -> OhsomeResponse:
371
370
self ._OhsomeBaseClient__retry = False
372
371
self ._handle_request ()
373
372
374
- ohsome_exception = OhsomeException (
373
+ raise OhsomeException (
375
374
message = str (e ),
376
375
url = self ._url ,
377
376
params = self ._parameters ,
378
377
response = e .response ,
379
378
)
379
+ return response
380
380
381
- except KeyboardInterrupt :
382
- ohsome_exception = OhsomeException (
383
- message = "Keyboard Interrupt: Query was interrupted by the user." ,
381
+ def _check_response (self , response : Response ) -> None :
382
+ try :
383
+ response .raise_for_status ()
384
+ except requests .exceptions .HTTPError as e :
385
+ try :
386
+ error_message = e .response .json ()["message" ]
387
+ except json .decoder .JSONDecodeError :
388
+ error_message = f"Invalid URL: Is { self ._url } valid?"
389
+
390
+ raise OhsomeException (
391
+ message = error_message ,
384
392
url = self ._url ,
385
393
params = self ._parameters ,
386
- error_code = 440 ,
394
+ error_code = e .response .status_code ,
395
+ response = e .response ,
387
396
)
388
397
389
- except ValueError as e :
398
+ def _get_response_data (self , response : Response ) -> dict :
399
+ try :
400
+ return response .json ()
401
+ except (ValueError , JSONDecodeError ) as e :
390
402
if response :
391
403
error_code , message = extract_error_message_from_invalid_json (
392
404
response .text
393
405
)
394
406
else :
395
407
message = str (e )
396
408
error_code = None
397
- ohsome_exception = OhsomeException (
409
+ raise OhsomeException (
398
410
message = message ,
399
411
url = self ._url ,
400
412
error_code = error_code ,
401
413
params = self ._parameters ,
402
414
response = response ,
403
415
)
404
-
405
416
except AttributeError :
406
- ohsome_exception = OhsomeException (
417
+ raise OhsomeException (
407
418
message = f"Seems like { self ._url } is not a valid endpoint." ,
408
419
url = self ._url ,
409
420
error_code = 404 ,
410
421
params = self ._parameters ,
411
422
)
412
423
413
- # If there has been an error and logging is enabled, write it to file
414
- if ohsome_exception :
415
- if self .log :
416
- ohsome_exception .log (self .log_dir )
417
- raise ohsome_exception
418
-
419
- return OhsomeResponse (response , url = self ._url , params = self ._parameters )
420
-
421
424
def _format_parameters (self , params ):
422
425
"""
423
426
Check and format parameters of the query
0 commit comments