def METHOD_NAME(self, method, url, timeout=(10, 10), raise_for_status=True, **kwargs):
    r"""Send a request with `requests`.
    :param method: The HTTP method to use, one of "GET", "PUT", "POST",
        "PATCH", "DELETE", "OPTIONS" or "HEAD"
    :param url: The URL to request
    :param timeout: How long (in seconds) to wait before raising an error.
        This can be a (connect_timeout, read_timeout) 2-tuple or it can be
        a single float that will be used as both the connect and read
        timeout.
        Good practice is to set this to slightly larger than a multiple of
        3, which is the default TCP packet retransmission window. See:
        https://docs.python-requests.org/en/master/user/advanced/#timeouts
        Note that the read_timeout is *not* a time limit on the entire
        response download. It's a time limit on how long to wait *between
        bytes from the server*. The entire download can take much longer.
    :param raise_for_status: Optionally raise for 4xx & 5xx response
        statuses.
    :param \**kwargs: Any other keyword arguments will be passed directly
        to requests.Session().request():
        https://docs.python-requests.org/en/latest/api/#requests.Session.request
    :raise request.exceptions are mapped to via's exception on
        DEFAULT_ERROR_MAP
    :raise UnhandledUpstreamException: For any non mapped exception raised
        by requests
    :raise Exception: For any non requests exception raised
    :returns: a request.Response
    """
    response = None
    try:
        response = self._session.METHOD_NAME(
            method,
            url,
            timeout=timeout,
            **kwargs,
        )
        if raise_for_status:
            response.raise_for_status()
    except Exception as err:
        if mapped_err := self._translate_exception(err):
            raise mapped_err from err
        raise
    return response