3232import math
3333import os
3434import ssl
35+ import random
3536import sys
3637import threading
3738import time
@@ -994,14 +995,40 @@ async def _async_request_once(
994995 headers = http_request .headers ,
995996 trust_env = True ,
996997 )
997- response = await session .request (
998- method = http_request .method ,
999- url = http_request .url ,
1000- headers = http_request .headers ,
1001- data = data ,
1002- timeout = aiohttp .ClientTimeout (connect = http_request .timeout ),
1003- ** self ._async_client_session_request_args ,
1004- )
998+ try :
999+ response = await session .request (
1000+ method = http_request .method ,
1001+ url = http_request .url ,
1002+ headers = http_request .headers ,
1003+ data = data ,
1004+ timeout = aiohttp .ClientTimeout (connect = http_request .timeout ),
1005+ ** self ._async_client_session_request_args ,
1006+ )
1007+ except (
1008+ aiohttp .ClientConnectorError ,
1009+ aiohttp .ClientConnectorDNSError ,
1010+ aiohttp .ClientOSError ,
1011+ aiohttp .ServerDisconnectedError ,
1012+ ) as e :
1013+ await asyncio .sleep (1 + random .randint (0 , 9 ))
1014+ logger .info ('Retrying due to aiohttp error: %s' % e )
1015+ # Retrieve the SSL context from the session.
1016+ self ._async_client_session_request_args = (
1017+ self ._ensure_aiohttp_ssl_ctx (self ._http_options )
1018+ )
1019+ # Instantiate a new session with the updated SSL context.
1020+ session = aiohttp .ClientSession (
1021+ headers = http_request .headers ,
1022+ trust_env = True ,
1023+ )
1024+ response = await session .request (
1025+ method = http_request .method ,
1026+ url = http_request .url ,
1027+ headers = http_request .headers ,
1028+ data = data ,
1029+ timeout = aiohttp .ClientTimeout (connect = http_request .timeout ),
1030+ ** self ._async_client_session_request_args ,
1031+ )
10051032
10061033 await errors .APIError .raise_for_async_response (response )
10071034 return HttpResponse (response .headers , response , session = session )
@@ -1022,20 +1049,48 @@ async def _async_request_once(
10221049 return HttpResponse (client_response .headers , client_response )
10231050 else :
10241051 if self ._use_aiohttp ():
1025- async with aiohttp .ClientSession (
1026- headers = http_request .headers ,
1027- trust_env = True ,
1028- ) as session :
1029- response = await session .request (
1030- method = http_request .method ,
1031- url = http_request .url ,
1052+ try :
1053+ async with aiohttp .ClientSession (
10321054 headers = http_request .headers ,
1033- data = data ,
1034- timeout = aiohttp .ClientTimeout (connect = http_request .timeout ),
1035- ** self ._async_client_session_request_args ,
1055+ trust_env = True ,
1056+ ) as session :
1057+ response = await session .request (
1058+ method = http_request .method ,
1059+ url = http_request .url ,
1060+ headers = http_request .headers ,
1061+ data = data ,
1062+ timeout = aiohttp .ClientTimeout (connect = http_request .timeout ),
1063+ ** self ._async_client_session_request_args ,
1064+ )
1065+ await errors .APIError .raise_for_async_response (response )
1066+ return HttpResponse (response .headers , [await response .text ()])
1067+ except (
1068+ aiohttp .ClientConnectorError ,
1069+ aiohttp .ClientConnectorDNSError ,
1070+ aiohttp .ClientOSError ,
1071+ aiohttp .ServerDisconnectedError ,
1072+ ) as e :
1073+ await asyncio .sleep (1 + random .randint (0 , 9 ))
1074+ logger .info ('Retrying due to aiohttp error: %s' % e )
1075+ # Retrieve the SSL context from the session.
1076+ self ._async_client_session_request_args = (
1077+ self ._ensure_aiohttp_ssl_ctx (self ._http_options )
10361078 )
1037- await errors .APIError .raise_for_async_response (response )
1038- return HttpResponse (response .headers , [await response .text ()])
1079+ # Instantiate a new session with the updated SSL context.
1080+ async with aiohttp .ClientSession (
1081+ headers = http_request .headers ,
1082+ trust_env = True ,
1083+ ) as session :
1084+ response = await session .request (
1085+ method = http_request .method ,
1086+ url = http_request .url ,
1087+ headers = http_request .headers ,
1088+ data = data ,
1089+ timeout = aiohttp .ClientTimeout (connect = http_request .timeout ),
1090+ ** self ._async_client_session_request_args ,
1091+ )
1092+ await errors .APIError .raise_for_async_response (response )
1093+ return HttpResponse (response .headers , [await response .text ()])
10391094 else :
10401095 # aiohttp is not available. Fall back to httpx.
10411096 client_response = await self ._async_httpx_client .request (
0 commit comments