diff --git a/server/lib/python/cartodb_services/cartodb_services/here/geocoder.py b/server/lib/python/cartodb_services/cartodb_services/here/geocoder.py index 1ae6ca8..a221db9 100644 --- a/server/lib/python/cartodb_services/cartodb_services/here/geocoder.py +++ b/server/lib/python/cartodb_services/cartodb_services/here/geocoder.py @@ -14,6 +14,8 @@ class HereMapsGeocoder: STAGING_GEOCODE_JSON_URL = 'https://geocoder.cit.api.here.com/6.2/geocode.json' DEFAULT_MAXRESULTS = 1 DEFAULT_GEN = 9 + READ_TIMEOUT = 60 + CONNECT_TIMEOUT = 10 ADDRESS_PARAMS = [ 'city', @@ -85,7 +87,8 @@ class HereMapsGeocoder: 'gen': self.gen } request_params.update(params) - response = requests.get(self.host, params=request_params) + response = requests.get(self.host, params=request_params, + timeout=(self.CONNECT_TIMEOUT, self.READ_TIMEOUT)) if response.status_code == requests.codes.ok: return json.loads(response.text) elif response.status_code == requests.codes.bad_request: diff --git a/server/lib/python/cartodb_services/cartodb_services/here/routing.py b/server/lib/python/cartodb_services/cartodb_services/here/routing.py index a6f8486..11856be 100644 --- a/server/lib/python/cartodb_services/cartodb_services/here/routing.py +++ b/server/lib/python/cartodb_services/cartodb_services/here/routing.py @@ -10,6 +10,8 @@ class HereMapsRoutingIsoline: PRODUCTION_ROUTING_BASE_URL = 'https://isoline.route.api.here.com' STAGING_ROUTING_BASE_URL = 'https://isoline.route.cit.api.here.com' ISOLINE_PATH = '/routing/7.2/calculateisoline.json' + READ_TIMEOUT = 60 + CONNECT_TIMEOUT = 10 ACCEPTED_MODES = { "walk": "pedestrian", @@ -50,7 +52,8 @@ class HereMapsRoutingIsoline: data_range, range_type, parsed_options) - response = requests.get(self._url, params=request_params) + response = requests.get(self._url, params=request_params, + timeout=(self.CONNECT_TIMEOUT, self.READ_TIMEOUT)) if response.status_code == requests.codes.ok: return self.__parse_isolines_response(response.text) elif response.status_code == requests.codes.bad_request: diff --git a/server/lib/python/cartodb_services/cartodb_services/mapzen/geocoder.py b/server/lib/python/cartodb_services/cartodb_services/mapzen/geocoder.py index ac869f5..4cc974d 100644 --- a/server/lib/python/cartodb_services/cartodb_services/mapzen/geocoder.py +++ b/server/lib/python/cartodb_services/cartodb_services/mapzen/geocoder.py @@ -11,6 +11,8 @@ class MapzenGeocoder: 'A Mapzen Geocoder wrapper for python' BASE_URL = 'https://search.mapzen.com/v1/search' + READ_TIMEOUT = 60 + CONNECT_TIMEOUT = 10 def __init__(self, app_key, logger, base_url=BASE_URL): self._app_key = app_key @@ -24,7 +26,8 @@ class MapzenGeocoder: state_province, country, search_type) try: - response = requests.get(self._url, params=request_params) + response = requests.get(self._url, params=request_params, + timeout=(self.CONNECT_TIMEOUT, self.READ_TIMEOUT)) if response.status_code == requests.codes.ok: return self.__parse_response(response.text) elif response.status_code == requests.codes.bad_request: @@ -41,6 +44,12 @@ class MapzenGeocoder: "state_province": state_province}) raise ServiceException('Error trying to geocode {0} using mapzen'.format(searchtext), response) + except requests.Timeout as te: + # In case of timeout we want to stop the job because the server + # could be down + self._logger.error('Timeout connecting to Mapzen geocoding server') + raise ServiceException('Error trying to geocode {0} using mapzen'.format(searchtext), + None) except requests.ConnectionError as e: # Don't raise the exception to continue with the geocoding job self._logger.error('Error connecting to Mapzen geocoding server', diff --git a/server/lib/python/cartodb_services/cartodb_services/mapzen/matrix_client.py b/server/lib/python/cartodb_services/cartodb_services/mapzen/matrix_client.py index 9fe1b4e..98639e3 100644 --- a/server/lib/python/cartodb_services/cartodb_services/mapzen/matrix_client.py +++ b/server/lib/python/cartodb_services/cartodb_services/mapzen/matrix_client.py @@ -19,6 +19,8 @@ class MatrixClient: """ ONE_TO_MANY_URL = 'https://matrix.mapzen.com/one_to_many' + READ_TIMEOUT = 60 + CONNECT_TIMEOUT = 10 def __init__(self, matrix_key, logger): self._matrix_key = matrix_key @@ -41,7 +43,8 @@ class MatrixClient: 'costing': costing, 'api_key': self._matrix_key } - response = requests.get(self.ONE_TO_MANY_URL, params=request_params) + response = requests.get(self.ONE_TO_MANY_URL, params=request_params, + timeout=(self.CONNECT_TIMEOUT, self.READ_TIMEOUT)) if response.status_code != requests.codes.ok: self._logger.error('Error trying to get matrix distance from mapzen', diff --git a/server/lib/python/cartodb_services/cartodb_services/mapzen/routing.py b/server/lib/python/cartodb_services/cartodb_services/mapzen/routing.py index 0067514..e0dca62 100644 --- a/server/lib/python/cartodb_services/cartodb_services/mapzen/routing.py +++ b/server/lib/python/cartodb_services/cartodb_services/mapzen/routing.py @@ -11,6 +11,8 @@ class MapzenRouting: 'A Mapzen Routing wrapper for python' PRODUCTION_ROUTING_BASE_URL = 'https://valhalla.mapzen.com/route' + READ_TIMEOUT = 60 + CONNECT_TIMEOUT = 10 ACCEPTED_MODES = { "walk": "pedestrian", @@ -43,7 +45,8 @@ class MapzenRouting: mode_param, units) request_params = self.__parse_request_parameters(json_request_params) - response = requests.get(self._url, params=request_params) + response = requests.get(self._url, params=request_params, + timeout=(self.CONNECT_TIMEOUT, self.READ_TIMEOUT)) if response.status_code == requests.codes.ok: return self.__parse_routing_response(response.text) elif response.status_code == requests.codes.bad_request: diff --git a/server/lib/python/cartodb_services/setup.py b/server/lib/python/cartodb_services/setup.py index b3726f5..dc075bc 100644 --- a/server/lib/python/cartodb_services/setup.py +++ b/server/lib/python/cartodb_services/setup.py @@ -10,7 +10,7 @@ from setuptools import setup, find_packages setup( name='cartodb_services', - version='0.9.3', + version='0.9.4', description='CartoDB Services API Python Library',