async def METHOD_NAME(
    self,
    method: str,
    url: str,
    params: Optional[Dict[str, object]] = None,
    data: Optional[Dict[str, object]] = None,
    headers: Optional[Dict[str, str]] = None,
    auth: Optional[Tuple[str, str]] = None,
    timeout: Optional[float] = None,
    allow_redirects: bool = False,
) -> Response:
    """
    Make an asynchronous HTTP Request with parameters provided.
    :param method: The HTTP method to use
    :param url: The URL to request
    :param params: Query parameters to append to the URL
    :param data: Parameters to go in the body of the HTTP request
    :param headers: HTTP Headers to send with the request
    :param auth: Basic Auth arguments (username, password entries)
    :param timeout: Socket/Read timeout for the request. Overrides the timeout if set on the client.
    :param allow_redirects: Whether or not to allow redirects
    See the requests documentation for explanation of all these parameters
    :return: An http response
    """
    if timeout is not None and timeout <= 0:
        raise ValueError(timeout)
    basic_auth = None
    if auth is not None:
        basic_auth = BasicAuth(login=auth[0], password=auth[1])
    kwargs = {
        "method": method.upper(),
        "url": url,
        "params": params,
        "data": data,
        "headers": headers,
        "auth": basic_auth,
        "timeout": timeout,
        "allow_redirects": allow_redirects,
    }
    self.log_request(kwargs)
    self._test_only_last_response = None
    temp = False
    session = None
    if self.session:
        session = self.session
    else:
        session = ClientSession()
        temp = True
    self._test_only_last_request = TwilioRequest(**kwargs)
    response = await session.METHOD_NAME(**kwargs)
    self.log_response(response.status, response)
    self._test_only_last_response = Response(
        response.status, await response.text(), response.headers
    )
    if temp:
        await session.close()
    return self._test_only_last_response