Skip to content

Commit b6dd68b

Browse files
committed
fix(web): hotfix unclosed uvloop SSL transport
MagicStack/uvloop#471 (comment) aio-libs/aiohttp#6762 (comment) Signed-off-by: Rongrong <[email protected]>
1 parent a45dac2 commit b6dd68b

File tree

2 files changed

+23
-11
lines changed

2 files changed

+23
-11
lines changed

src/compat.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import sys
55
import functools
66

7+
from aiohttp import ClientResponse
78
from cachetools.keys import hashkey
89

910
_version_info = sys.version_info
@@ -34,9 +35,19 @@ def __exit__(self, *excinfo):
3435
async def __aenter__(self):
3536
return self.enter_result
3637

37-
async def __aexit__(self, *excinfo):
38+
async def __aexit__(self, exc_type, exc_value, traceback):
3839
pass
3940

41+
42+
class AiohttpUvloopTransportHotfix(AbstractAsyncContextManager):
43+
def __init__(self, response: ClientResponse):
44+
self.transport = response.connection and response.connection.transport
45+
46+
async def __aexit__(self, exc_type, exc_value, traceback):
47+
if self.transport:
48+
self.transport.abort()
49+
50+
4051
# default cipher list in Python 3.9
4152
_ciphers_py39 = (
4253
'TLS_AES_256_GCM_SHA384:'

src/web.py

+11-10
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from typing import Union, Optional, AnyStr
33
from typing_extensions import Final
44
from collections.abc import Callable
5-
from .compat import nullcontext, ssl_create_default_context
5+
from .compat import nullcontext, ssl_create_default_context, AiohttpUvloopTransportHotfix
66

77
import re
88
import asyncio
@@ -225,15 +225,16 @@ async def _fetch():
225225
async with aiohttp.ClientSession(connector=proxy_connector, timeout=aiohttp.ClientTimeout(total=timeout),
226226
headers=_headers) as session:
227227
async with session.get(url, read_bufsize=read_bufsize, read_until_eof=read_until_eof) as response:
228-
status = response.status
229-
content = None
230-
if status == 200:
231-
content = await resp_callback(response)
232-
return WebResponse(url=url,
233-
content=content,
234-
headers=response.headers,
235-
status=status,
236-
reason=response.reason)
228+
async with AiohttpUvloopTransportHotfix(response):
229+
status = response.status
230+
content = None
231+
if status == 200:
232+
content = await resp_callback(response)
233+
return WebResponse(url=url,
234+
content=content,
235+
headers=response.headers,
236+
status=status,
237+
reason=response.reason)
237238

238239
tries = 0
239240
retry_in_v4_flag = False

0 commit comments

Comments
 (0)