Skip to content

Commit 509c372

Browse files
authored
Use default ssl context (#32540)
* Use default ssl context * update * update * update * add test * update * update * Update sdk/core/azure-core/azure/core/pipeline/transport/_aiohttp.py * update release date * update * update * update
1 parent b3a1d9a commit 509c372

File tree

3 files changed

+75
-12
lines changed

3 files changed

+75
-12
lines changed

sdk/core/azure-core/CHANGELOG.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
# Release History
22

3-
## 1.29.5 (Unreleased)
4-
5-
### Features Added
6-
7-
### Breaking Changes
3+
## 1.29.5 (2023-10-19)
84

95
### Bugs Fixed
106

117
- Fixed an issue with `multipart/form-data` in the async transport where `data` was not getting encoded into the request body. #32473
128

139
### Other Changes
1410

11+
- Use ssl context from aiohttp by default.
12+
1513
## 1.29.4 (2023-09-07)
1614

1715
### Bugs Fixed

sdk/core/azure-core/azure/core/pipeline/transport/_aiohttp.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,16 @@
2525
# --------------------------------------------------------------------------
2626
from __future__ import annotations
2727
import sys
28-
from typing import Any, Optional, AsyncIterator as AsyncIteratorType, TYPE_CHECKING, overload, cast, Union, Type
28+
from typing import (
29+
Any,
30+
Optional,
31+
AsyncIterator as AsyncIteratorType,
32+
TYPE_CHECKING,
33+
overload,
34+
cast,
35+
Union,
36+
Type,
37+
)
2938
from types import TracebackType
3039
from collections.abc import AsyncIterator
3140

@@ -86,7 +95,12 @@ class AioHttpTransport(AsyncHttpTransport):
8695
"""
8796

8897
def __init__(
89-
self, *, session: Optional[aiohttp.ClientSession] = None, loop=None, session_owner: bool = True, **kwargs
98+
self,
99+
*,
100+
session: Optional[aiohttp.ClientSession] = None,
101+
loop=None,
102+
session_owner: bool = True,
103+
**kwargs,
90104
):
91105
if loop and sys.version_info >= (3, 10):
92106
raise ValueError("Starting with Python 3.10, asyncio doesn’t support loop as a parameter anymore")
@@ -246,10 +260,13 @@ async def send(
246260
break
247261

248262
response: Optional[Union[AsyncHttpResponse, RestAsyncHttpResponse]] = None
249-
config["ssl"] = self._build_ssl_config(
263+
ssl = self._build_ssl_config(
250264
cert=config.pop("connection_cert", self.connection_config.cert),
251265
verify=config.pop("connection_verify", self.connection_config.verify),
252266
)
267+
# If ssl=True, we just use default ssl context from aiohttp
268+
if ssl is not True:
269+
config["ssl"] = ssl
253270
# If we know for sure there is not body, disable "auto content type"
254271
# Otherwise, aiohttp will send "application/octet-stream" even for empty POST request
255272
# and that break services like storage signature

sdk/core/azure-core/tests/async_tests/test_pipeline_async.py

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
AsyncioRequestsTransport,
4343
TrioRequestsTransport,
4444
AioHttpTransport,
45+
HttpRequest,
4546
)
4647

4748
from azure.core.polling.async_base_polling import AsyncLROBasePolling
@@ -58,6 +59,12 @@
5859
from utils import HTTP_REQUESTS
5960

6061

62+
try:
63+
from unittest.mock import AsyncMock, PropertyMock
64+
except ImportError:
65+
pass
66+
67+
6168
@pytest.mark.asyncio
6269
@pytest.mark.parametrize("http_request", HTTP_REQUESTS)
6370
async def test_sans_io_exception(http_request):
@@ -272,7 +279,10 @@ def send(*args):
272279
assert pos_boo > pos_retry
273280

274281
client = AsyncPipelineClient(
275-
base_url="test", config=config, per_call_policies=boo_policy, per_retry_policies=foo_policy
282+
base_url="test",
283+
config=config,
284+
per_call_policies=boo_policy,
285+
per_retry_policies=foo_policy,
276286
)
277287
policies = client._pipeline._impl_policies
278288
assert boo_policy in policies
@@ -284,7 +294,10 @@ def send(*args):
284294
assert pos_foo > pos_retry
285295

286296
client = AsyncPipelineClient(
287-
base_url="test", config=config, per_call_policies=[boo_policy], per_retry_policies=[foo_policy]
297+
base_url="test",
298+
config=config,
299+
per_call_policies=[boo_policy],
300+
per_retry_policies=[foo_policy],
288301
)
289302
policies = client._pipeline._impl_policies
290303
assert boo_policy in policies
@@ -311,13 +324,19 @@ def send(*args):
311324
assert foo_policy == actual_policies[2]
312325

313326
client = AsyncPipelineClient(
314-
base_url="test", policies=policies, per_call_policies=boo_policy, per_retry_policies=[foo_policy]
327+
base_url="test",
328+
policies=policies,
329+
per_call_policies=boo_policy,
330+
per_retry_policies=[foo_policy],
315331
)
316332
actual_policies = client._pipeline._impl_policies
317333
assert boo_policy == actual_policies[0]
318334
assert foo_policy == actual_policies[3]
319335
client = AsyncPipelineClient(
320-
base_url="test", policies=policies, per_call_policies=[boo_policy], per_retry_policies=[foo_policy]
336+
base_url="test",
337+
policies=policies,
338+
per_call_policies=[boo_policy],
339+
per_retry_policies=[foo_policy],
321340
)
322341
actual_policies = client._pipeline._impl_policies
323342
assert boo_policy == actual_policies[0]
@@ -337,3 +356,32 @@ def test_no_cleanup_policy_when_redirect_policy_is_empty():
337356
for policy in policies:
338357
if isinstance(policy, SensitiveHeaderCleanupPolicy):
339358
assert False
359+
360+
361+
@pytest.mark.skipif(sys.version_info < (3, 8), reason="Python 3.7 does not support AsyncMock")
362+
@pytest.mark.asyncio
363+
async def test_default_ssl_context():
364+
class MockAiohttpSession:
365+
async def __aenter__(self):
366+
pass
367+
368+
async def __aexit__(self, exc_type, exc_val, exc_tb):
369+
pass
370+
371+
async def close(self):
372+
pass
373+
374+
async def open(self):
375+
pass
376+
377+
async def request(self, method: str, url: str, **kwargs):
378+
assert "ssl" not in kwargs
379+
mock_response = AsyncMock(spec=aiohttp.ClientResponse)
380+
type(mock_response).status = PropertyMock(return_value=200)
381+
return mock_response
382+
383+
transport = AioHttpTransport(session=MockAiohttpSession(), session_owner=False)
384+
pipeline = AsyncPipeline(transport=transport)
385+
386+
req = HttpRequest("GET", "https://bing.com")
387+
await pipeline.run(req)

0 commit comments

Comments
 (0)