diff --git a/tests/unit/http/test_async_http_client.py b/tests/unit/http/test_async_http_client.py index 23df35dc0..e6718732c 100644 --- a/tests/unit/http/test_async_http_client.py +++ b/tests/unit/http/test_async_http_client.py @@ -49,10 +49,23 @@ async def test_request_called_with_basic_auth(self): ) self.session_mock.request.assert_called() - auth = self.session_mock.request.call_args.kwargs["auth"] - self.assertIsNotNone(auth) - self.assertEqual(auth.login, "account_sid") - self.assertEqual(auth.password, "auth_token") + kwargs = self.session_mock.request.call_args.kwargs + try: + from aiohttp import encode_basic_auth + except ImportError: + encode_basic_auth = None + + if encode_basic_auth is not None: + self.assertEqual( + kwargs["headers"]["Authorization"], + encode_basic_auth("account_sid", "auth_token"), + ) + self.assertIsNone(kwargs["auth"]) + else: + auth = kwargs["auth"] + self.assertIsNotNone(auth) + self.assertEqual(auth.login, "account_sid") + self.assertEqual(auth.password, "auth_token") async def test_invalid_request_timeout_raises_exception(self): with self.assertRaises(ValueError): diff --git a/twilio/http/async_http_client.py b/twilio/http/async_http_client.py index ecd5d4de9..f30a75bca 100644 --- a/twilio/http/async_http_client.py +++ b/twilio/http/async_http_client.py @@ -1,9 +1,17 @@ import logging from typing import Dict, Optional, Tuple -from aiohttp import BasicAuth, ClientSession +from aiohttp import ClientSession from aiohttp_retry import ExponentialRetry, RetryClient +try: + from aiohttp import encode_basic_auth +except ImportError: + encode_basic_auth = None # type: ignore[misc, assignment] + +if encode_basic_auth is None: + from aiohttp import BasicAuth + from twilio.http import AsyncHttpClient from twilio.http.request import Request as TwilioRequest from twilio.http.response import Response @@ -79,16 +87,24 @@ async def request( if timeout is not None and timeout <= 0: raise ValueError(timeout) + request_headers = dict(headers) if headers is not None else None basic_auth = None if auth is not None: - basic_auth = BasicAuth(login=auth[0], password=auth[1]) + if encode_basic_auth is not None: + if request_headers is None: + request_headers = {} + request_headers["Authorization"] = encode_basic_auth( + auth[0], auth[1] + ) + else: + basic_auth = BasicAuth(login=auth[0], password=auth[1]) kwargs = { "method": method.upper(), "url": url, "params": params, "data": data, - "headers": headers, + "headers": request_headers, "auth": basic_auth, "timeout": timeout, "allow_redirects": allow_redirects,