|
6 | 6 |
|
7 | 7 | import aiohttp |
8 | 8 |
|
| 9 | +from dashscope.api_entities.aio_session import get_shared_aio_session |
9 | 10 | from dashscope.api_entities.base_request import AioBaseRequest |
10 | 11 | from dashscope.api_entities.dashscope_response import DashScopeAPIResponse |
11 | 12 | from dashscope.common.constants import ( |
@@ -38,7 +39,9 @@ def __init__( |
38 | 39 | api_key (str): The api key. |
39 | 40 | method (str): The http method(GET|POST). |
40 | 41 | stream (bool, optional): Is stream request. Defaults to True. |
41 | | - timeout (int, optional): Total request timeout. |
| 42 | + timeout (int, optional): Request timeout in seconds. For streaming |
| 43 | + requests, this is the idle timeout between chunks (sock_read); |
| 44 | + for non-streaming requests, this is the total request timeout. |
42 | 45 | Defaults to DEFAULT_REQUEST_TIMEOUT_SECONDS. |
43 | 46 | user_agent (str, optional): Additional user agent string to |
44 | 47 | append. Defaults to ''. |
@@ -246,41 +249,49 @@ async def _handle_response( # pylint: disable=too-many-branches |
246 | 249 |
|
247 | 250 | async def _handle_request(self): |
248 | 251 | try: |
249 | | - async with aiohttp.ClientSession( |
250 | | - timeout=aiohttp.ClientTimeout(total=self.timeout), |
251 | | - headers=self.headers, |
252 | | - ) as session: |
253 | | - logger.debug("Starting request: %s", self.url) |
254 | | - if self.method == HTTPMethod.POST: |
255 | | - is_form, obj = self.data.get_aiohttp_payload() |
256 | | - if is_form: |
257 | | - headers = {**self.headers, **obj.headers} |
258 | | - response = await session.post( |
259 | | - url=self.url, |
260 | | - data=obj, |
261 | | - headers=headers, |
262 | | - ) |
263 | | - else: |
264 | | - response = await session.request( |
265 | | - "POST", |
266 | | - url=self.url, |
267 | | - json=obj, |
268 | | - headers=self.headers, |
269 | | - ) |
270 | | - elif self.method == HTTPMethod.GET: |
271 | | - response = await session.get( |
| 252 | + session = await get_shared_aio_session() |
| 253 | + if self.stream: |
| 254 | + request_timeout = aiohttp.ClientTimeout( |
| 255 | + total=None, |
| 256 | + sock_read=self.timeout, |
| 257 | + ) |
| 258 | + else: |
| 259 | + request_timeout = aiohttp.ClientTimeout(total=self.timeout) |
| 260 | + |
| 261 | + logger.debug("Starting request: %s", self.url) |
| 262 | + if self.method == HTTPMethod.POST: |
| 263 | + is_form, obj = self.data.get_aiohttp_payload() |
| 264 | + if is_form: |
| 265 | + headers = {**self.headers, **obj.headers} |
| 266 | + response = await session.post( |
272 | 267 | url=self.url, |
273 | | - params=self.data.parameters, |
274 | | - headers=self.headers, |
| 268 | + data=obj, |
| 269 | + headers=headers, |
| 270 | + timeout=request_timeout, |
275 | 271 | ) |
276 | 272 | else: |
277 | | - raise UnsupportedHTTPMethod( |
278 | | - f"Unsupported http method: {self.method}", |
| 273 | + response = await session.request( |
| 274 | + "POST", |
| 275 | + url=self.url, |
| 276 | + json=obj, |
| 277 | + headers=self.headers, |
| 278 | + timeout=request_timeout, |
279 | 279 | ) |
280 | | - logger.debug("Response returned: %s", self.url) |
281 | | - async with response: |
282 | | - async for rsp in self._handle_response(response): |
283 | | - yield rsp |
| 280 | + elif self.method == HTTPMethod.GET: |
| 281 | + response = await session.get( |
| 282 | + url=self.url, |
| 283 | + params=self.data.parameters, |
| 284 | + headers=self.headers, |
| 285 | + timeout=request_timeout, |
| 286 | + ) |
| 287 | + else: |
| 288 | + raise UnsupportedHTTPMethod( |
| 289 | + f"Unsupported http method: {self.method}", |
| 290 | + ) |
| 291 | + logger.debug("Response returned: %s", self.url) |
| 292 | + async with response: |
| 293 | + async for rsp in self._handle_response(response): |
| 294 | + yield rsp |
284 | 295 | except aiohttp.ClientConnectorError as e: |
285 | 296 | logger.error(e) |
286 | 297 | raise e |
|
0 commit comments