Skip to content

Commit a904bd1

Browse files
authored
expose http_session_cls in AioConfig (#1102)
1 parent 8294d52 commit a904bd1

6 files changed

Lines changed: 47 additions & 5 deletions

File tree

CHANGES.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
Changes
22
-------
33

4+
2.12.2 (2024-04-01)
5+
^^^^^^^^^^^^^^^^^^^
6+
* expose configuration of ``http_session_cls`` in ``AioConfig``
7+
48
2.12.1 (2024-03-04)
59
^^^^^^^^^^^^^^^^^^^
610
* fix use of proxies #1070

aiobotocore/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '2.12.1'
1+
__version__ = '2.12.2'

aiobotocore/args.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from botocore.args import ClientArgsCreator
66

77
from .config import AioConfig
8-
from .endpoint import AioEndpointCreator
8+
from .endpoint import DEFAULT_HTTP_SESSION_CLS, AioEndpointCreator
99
from .regions import AioEndpointRulesetResolver
1010
from .signers import AioRequestSigner
1111

@@ -67,8 +67,10 @@ def get_client_args(
6767
# aiobotocore addition
6868
if isinstance(client_config, AioConfig):
6969
connector_args = client_config.connector_args
70+
http_session_cls = client_config.http_session_cls
7071
else:
7172
connector_args = None
73+
http_session_cls = DEFAULT_HTTP_SESSION_CLS
7274

7375
new_config = AioConfig(connector_args, **config_kwargs)
7476
endpoint_creator = AioEndpointCreator(event_emitter)
@@ -79,9 +81,10 @@ def get_client_args(
7981
endpoint_url=endpoint_config['endpoint_url'],
8082
verify=verify,
8183
response_parser_factory=self._response_parser_factory,
84+
timeout=(new_config.connect_timeout, new_config.read_timeout),
8285
max_pool_connections=new_config.max_pool_connections,
86+
http_session_cls=http_session_cls,
8387
proxies=new_config.proxies,
84-
timeout=(new_config.connect_timeout, new_config.read_timeout),
8588
socket_options=socket_options,
8689
client_cert=new_config.client_cert,
8790
proxies_config=new_config.proxies_config,

aiobotocore/config.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,21 @@
33
import botocore.client
44
from botocore.exceptions import ParamValidationError
55

6+
from aiobotocore.endpoint import DEFAULT_HTTP_SESSION_CLS
7+
68

79
class AioConfig(botocore.client.Config):
8-
def __init__(self, connector_args=None, **kwargs):
10+
def __init__(
11+
self,
12+
connector_args=None,
13+
http_session_cls=DEFAULT_HTTP_SESSION_CLS,
14+
**kwargs,
15+
):
916
super().__init__(**kwargs)
1017

1118
self._validate_connector_args(connector_args)
1219
self.connector_args = copy.copy(connector_args)
20+
self.http_session_cls = http_session_cls
1321
if not self.connector_args:
1422
self.connector_args = dict()
1523

aiobotocore/endpoint.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
from aiobotocore.httpsession import AIOHTTPSession
2020
from aiobotocore.response import StreamingBody
2121

22+
DEFAULT_HTTP_SESSION_CLS = AIOHTTPSession
23+
2224

2325
async def convert_to_response_dict(http_response, operation_model):
2426
"""Convert an HTTP response object to a request dict.
@@ -295,7 +297,7 @@ def create_endpoint(
295297
response_parser_factory=None,
296298
timeout=DEFAULT_TIMEOUT,
297299
max_pool_connections=MAX_POOL_CONNECTIONS,
298-
http_session_cls=AIOHTTPSession,
300+
http_session_cls=DEFAULT_HTTP_SESSION_CLS,
299301
proxies=None,
300302
socket_options=None,
301303
client_cert=None,

tests/test_config.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from botocore.exceptions import ParamValidationError, ReadTimeoutError
77

88
from aiobotocore.config import AioConfig
9+
from aiobotocore.httpsession import AIOHTTPSession
910
from aiobotocore.session import AioSession, get_session
1011
from tests.mock_server import AIOServer
1112

@@ -132,3 +133,27 @@ def test_merge():
132133
assert isinstance(new_config, AioConfig)
133134
assert new_config is not config
134135
assert new_config is not other_config
136+
137+
138+
# Check that it's possible to specify custom http_session_cls
139+
@pytest.mark.moto
140+
@pytest.mark.asyncio
141+
async def test_config_http_session_cls():
142+
class SuccessExc(Exception):
143+
...
144+
145+
class MyHttpSession(AIOHTTPSession):
146+
async def send(self, request):
147+
raise SuccessExc
148+
149+
config = AioConfig(http_session_cls=MyHttpSession)
150+
session = AioSession()
151+
async with AIOServer() as server, session.create_client(
152+
's3',
153+
config=config,
154+
endpoint_url=server.endpoint_url,
155+
aws_secret_access_key='xxx',
156+
aws_access_key_id='xxx',
157+
) as s3_client:
158+
with pytest.raises(SuccessExc):
159+
await s3_client.get_object(Bucket='foo', Key='bar')

0 commit comments

Comments
 (0)