示例#1
0
    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
示例#2
0
    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
示例#3
0
文件: base.py 项目: azizur77/geopy
 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))
示例#4
0
文件: base.py 项目: prabhamatta/geopy
 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))
示例#5
0
    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
示例#6
0
 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)
示例#7
0
    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)
示例#8
0
文件: base.py 项目: sandywij/geopy
    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