def _request(self, url, *, timeout, headers): try: resp = self.session.get(url, timeout=timeout, headers=headers) except Exception as error: message = str(error) if isinstance(error, SocketTimeout): raise GeocoderTimedOut("Service timed out") elif isinstance(error, SSLError): if "timed out" in message: raise GeocoderTimedOut("Service timed out") elif isinstance(error, requests.ConnectionError): if "unauthorized" in message.lower(): raise GeocoderServiceError(message) else: raise GeocoderUnavailable(message) elif isinstance(error, requests.Timeout): raise GeocoderTimedOut("Service timed out") raise GeocoderServiceError(message) else: if resp.status_code >= 400: raise AdapterHTTPError( "Non-successful status code %s" % resp.status_code, status_code=resp.status_code, text=resp.text, ) return resp
def get_text(self, url, *, timeout, headers): req = Request(url=url, headers=headers) try: page = self.urlopen(req, timeout=timeout) except Exception as error: message = str(error.args[0]) if len(error.args) else str(error) if isinstance(error, HTTPError): code = error.getcode() body = self._read_http_error_body(error) raise AdapterHTTPError(message, status_code=code, text=body) elif isinstance(error, URLError): if "timed out" in message: raise GeocoderTimedOut("Service timed out") elif "unreachable" in message: raise GeocoderUnavailable("Service not available") elif isinstance(error, SocketTimeout): raise GeocoderTimedOut("Service timed out") elif isinstance(error, SSLError): if "timed out" in message: raise GeocoderTimedOut("Service timed out") raise GeocoderServiceError(message) else: text = self._decode_page(page) status_code = page.getcode() if status_code >= 400: raise AdapterHTTPError( "Non-successful status code %s" % status_code, status_code=status_code, text=text ) return text
def _call_geocoder(self, url, timeout=None, raw=False): """ For a generated query URL, get the results. """ try: page = self.urlopen(url, timeout=timeout or self.timeout) except Exception as error: # pylint: disable=W0703 if hasattr(self, '_geocoder_exception_handler'): self._geocoder_exception_handler(error) # pylint: disable=E1101 if isinstance(error, HTTPError): if error.msg.lower().contains("unauthorized"): raise GeocoderAuthenticationFailure("Unauthorized") raise GeocoderServiceError(error.getcode(), error.msg) elif isinstance(error, URLError): if "timed out" in error.reason: raise GeocoderTimedOut('Service timed out') raise elif isinstance(error, SocketTimeout): raise GeocoderTimedOut('Service timed out') elif isinstance(error, SSLError): if error.message == 'The read operation timed out': raise GeocoderTimedOut('Service timed out') raise else: raise if raw: return page return json.loads(decode_page(page))
def _call_geocoder(self, url, timeout=None, raw=False): """ For a generated query URL, get the results. """ try: page = self.urlopen(url, timeout=timeout or self.timeout) except Exception as error: # pylint: disable=W0703 message = (str(error) if not py3k else (str(error.args[0]) if len(error.args) else str(error))) if hasattr(self, '_geocoder_exception_handler'): self._geocoder_exception_handler(error, message) # pylint: disable=E1101 if isinstance(error, HTTPError): code = error.getcode() try: raise ERROR_CODE_MAP[code](message) except KeyError: raise GeocoderServiceError(message) elif isinstance(error, URLError): if "timed out" in message: raise GeocoderTimedOut('Service timed out') elif isinstance(error, SocketTimeout): raise GeocoderTimedOut('Service timed out') elif isinstance(error, SSLError): if "timed out" in message: raise GeocoderTimedOut('Service timed out') raise GeocoderServiceError(message) if raw: return page return json.loads(decode_page(page))
def _call_geocoder(self, url, timeout=None, raw=False, requester=None, deserializer=json.loads, **kwargs): """ For a generated query URL, get the results. """ requester = requester or self.urlopen try: page = requester(url, timeout=(timeout or self.timeout), **kwargs) except Exception as error: # pylint: disable=W0703 message = (str(error) if not py3k else (str(error.args[0]) if len(error.args) else str(error))) if hasattr(self, '_geocoder_exception_handler'): self._geocoder_exception_handler(error, message) # pylint: disable=E1101 if isinstance(error, HTTPError): code = error.getcode() try: raise ERROR_CODE_MAP[code](message) except KeyError: raise GeocoderServiceError(message) elif isinstance(error, URLError): if "timed out" in message: raise GeocoderTimedOut('Service timed out') elif "unreachable" in message: raise GeocoderUnavailable('Service not available') elif isinstance(error, SocketTimeout): raise GeocoderTimedOut('Service timed out') elif isinstance(error, SSLError): if "timed out" in message: raise GeocoderTimedOut('Service timed out') raise GeocoderServiceError(message) if hasattr(page, 'getcode'): status_code = page.getcode() elif hasattr(page, 'status_code'): status_code = page.status_code else: status_code = None if status_code in ERROR_CODE_MAP: raise ERROR_CODE_MAP[page.status_code]("\n%s" % decode_page(page)) if raw: return page page = decode_page(page) if deserializer is not None: try: return deserializer(page) except ValueError: raise GeocoderParseError( "Could not deserialize using deserializer:\n%s" % page) else: return page
def _normalize_exceptions(self): try: yield except (GeopyError, AdapterHTTPError, AssertionError): raise except Exception as error: message = str(error) if isinstance(error, asyncio.TimeoutError): raise GeocoderTimedOut("Service timed out") elif isinstance(error, SSLError): if "timed out" in message: raise GeocoderTimedOut("Service timed out") elif isinstance(error, aiohttp.ClientConnectionError): raise GeocoderUnavailable(message) raise GeocoderServiceError(message)
def test_gec_country_code_exception(self, nominatim_mock): from geopy.exc import GeocoderTimedOut instance = nominatim_mock.return_value instance.reverse.side_effect = GeocoderTimedOut('Too busy') country_code = get_country_code(0, 0) self.assertIsNone(country_code)
def _call_geocoder(self, url, timeout=DEFAULT_SENTINEL, raw=False, requester=None, deserializer=json.loads, **kwargs): """ For a generated query URL, get the results. """ if requester: req = url # Don't construct an urllib's Request for a custom requester. # `requester` might be anything which can issue an HTTP request. # Assume that `requester` is a method of the `requests` library. # Requests, however, doesn't accept SSL context in its HTTP # request methods. A custom HTTP adapter has to be created for that. # So the current usage is not directly compatible with `requests`. requester = functools.partial(requester, context=self.ssl_context, proxies=self.proxies, headers=self.headers) else: if isinstance(url, Request): # copy Request headers = self.headers.copy() headers.update(url.header_items()) req = Request(url=url.get_full_url(), headers=headers) else: req = Request(url=url, headers=self.headers) requester = requester or self.urlopen if timeout is None: warnings.warn( ('`timeout=None` has been passed to a geocoder call. Using ' 'default geocoder timeout. In geopy 2.0 the ' 'behavior will be different: None will mean "no timeout" ' 'instead of "default geocoder timeout". Pass ' 'geopy.geocoders.base.DEFAULT_SENTINEL instead of None ' 'to get rid of this warning.'), DeprecationWarning) timeout = DEFAULT_SENTINEL timeout = (timeout if timeout is not DEFAULT_SENTINEL else self.timeout) try: page = requester(req, timeout=timeout, **kwargs) except Exception as error: message = (str(error) if not py3k else (str(error.args[0]) if len(error.args) else str(error))) self._geocoder_exception_handler(error, message) if isinstance(error, HTTPError): code = error.getcode() try: raise ERROR_CODE_MAP[code](message) except KeyError: raise GeocoderServiceError(message) elif isinstance(error, URLError): if "timed out" in message: raise GeocoderTimedOut('Service timed out') elif "unreachable" in message: raise GeocoderUnavailable('Service not available') elif isinstance(error, SocketTimeout): raise GeocoderTimedOut('Service timed out') elif isinstance(error, SSLError): if "timed out" in message: raise GeocoderTimedOut('Service timed out') raise GeocoderServiceError(message) if hasattr(page, 'getcode'): status_code = page.getcode() elif hasattr(page, 'status_code'): status_code = page.status_code else: status_code = None if status_code in ERROR_CODE_MAP: raise ERROR_CODE_MAP[page.status_code]("\n%s" % decode_page(page)) if raw: return page page = decode_page(page) if deserializer is not None: try: return deserializer(page) except ValueError: raise GeocoderParseError( "Could not deserialize using deserializer:\n%s" % page) else: return page