Feature: 细化内置驱动器请求参数中的超时控制颗粒度 (#3571)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Ju4tCode <42488585+yanyongyu@users.noreply.github.com>
This commit is contained in:
Ailitonia
2025-07-15 10:29:18 +08:00
committed by GitHub
parent bc0682af8f
commit 4ec9bfb7d7
8 changed files with 115 additions and 19 deletions

View File

@ -33,7 +33,14 @@ from nonebot.drivers import (
combine_driver,
)
from nonebot.drivers.none import Driver as NoneDriver
from nonebot.internal.driver import Cookies, CookieTypes, HeaderTypes, QueryTypes
from nonebot.internal.driver import (
Cookies,
CookieTypes,
HeaderTypes,
QueryTypes,
Timeout,
TimeoutTypes,
)
try:
import httpx
@ -52,7 +59,7 @@ class Session(HTTPClientSession):
headers: HeaderTypes = None,
cookies: CookieTypes = None,
version: Union[str, HTTPVersion] = HTTPVersion.H11,
timeout: Optional[float] = None,
timeout: TimeoutTypes = None,
proxy: Optional[str] = None,
):
self._client: Optional[httpx.AsyncClient] = None
@ -65,7 +72,16 @@ class Session(HTTPClientSession):
)
self._cookies = Cookies(cookies)
self._version = HTTPVersion(version)
self._timeout = timeout
if isinstance(timeout, Timeout):
self._timeout = httpx.Timeout(
timeout=timeout.total,
connect=timeout.connect,
read=timeout.read,
)
else:
self._timeout = httpx.Timeout(timeout)
self._proxy = proxy
@property
@ -76,6 +92,15 @@ class Session(HTTPClientSession):
@override
async def request(self, setup: Request) -> Response:
if isinstance(setup.timeout, Timeout):
timeout = httpx.Timeout(
timeout=setup.timeout.total,
connect=setup.timeout.connect,
read=setup.timeout.read,
)
else:
timeout = httpx.Timeout(setup.timeout)
response = await self.client.request(
setup.method,
str(setup.url),
@ -87,7 +112,7 @@ class Session(HTTPClientSession):
params=setup.url.raw_query_string,
headers=tuple(setup.headers.items()),
cookies=setup.cookies.jar,
timeout=setup.timeout,
timeout=timeout,
)
return Response(
response.status_code,
@ -103,6 +128,15 @@ class Session(HTTPClientSession):
*,
chunk_size: int = 1024,
) -> AsyncGenerator[Response, None]:
if isinstance(setup.timeout, Timeout):
timeout = httpx.Timeout(
timeout=setup.timeout.total,
connect=setup.timeout.connect,
read=setup.timeout.read,
)
else:
timeout = httpx.Timeout(setup.timeout)
async with self.client.stream(
setup.method,
str(setup.url),
@ -114,7 +148,7 @@ class Session(HTTPClientSession):
params=setup.url.raw_query_string,
headers=tuple(setup.headers.items()),
cookies=setup.cookies.jar,
timeout=setup.timeout,
timeout=timeout,
) as response:
response_headers = response.headers.multi_items()
async for chunk in response.aiter_bytes(chunk_size=chunk_size):
@ -183,7 +217,7 @@ class Mixin(HTTPClientMixin):
headers: HeaderTypes = None,
cookies: CookieTypes = None,
version: Union[str, HTTPVersion] = HTTPVersion.H11,
timeout: Optional[float] = None,
timeout: TimeoutTypes = None,
proxy: Optional[str] = None,
) -> Session:
return Session(