|
3 | 3 | import socket |
4 | 4 | import sys |
5 | 5 | from datetime import timedelta |
6 | | -from typing import TYPE_CHECKING, Any |
| 6 | +from typing import TYPE_CHECKING, Any, TypedDict |
7 | 7 | from unittest.mock import Mock |
8 | 8 |
|
9 | 9 | import aiohttp |
10 | 10 | from multidict import CIMultiDict, CIMultiDictProxy |
11 | 11 |
|
12 | 12 | from monty import constants |
13 | 13 | from monty.log import get_logger |
| 14 | +from monty.utils import helpers |
14 | 15 | from monty.utils.caching import RedisCache |
15 | 16 |
|
16 | 17 |
|
@@ -45,14 +46,29 @@ async def _on_request_end( |
45 | 46 | ) |
46 | 47 |
|
47 | 48 |
|
| 49 | +class SessionArgs(TypedDict): |
| 50 | + proxy: str | None |
| 51 | + connector: aiohttp.BaseConnector |
| 52 | + |
| 53 | + |
| 54 | +def session_args_for_proxy(proxy: str | None) -> SessionArgs: |
| 55 | + """Create a dict with `proxy` and `connector` items, to be passed to aiohttp.ClientSession.""" |
| 56 | + connector = aiohttp.TCPConnector( |
| 57 | + resolver=aiohttp.AsyncResolver(), |
| 58 | + family=socket.AF_INET, |
| 59 | + ssl=( |
| 60 | + helpers._SSL_CONTEXT_UNVERIFIED |
| 61 | + if (proxy and proxy.startswith("http://")) |
| 62 | + else helpers._SSL_CONTEXT_VERIFIED |
| 63 | + ), |
| 64 | + ) |
| 65 | + return {"proxy": proxy or None, "connector": connector} |
| 66 | + |
| 67 | + |
48 | 68 | class CachingClientSession(aiohttp.ClientSession): |
49 | 69 | def __init__(self, *args: Any, **kwargs: Any) -> None: |
50 | | - if "connector" not in kwargs: |
51 | | - kwargs["connector"] = aiohttp.TCPConnector( |
52 | | - resolver=aiohttp.AsyncResolver(), |
53 | | - family=socket.AF_INET, |
54 | | - verify_ssl=not bool(constants.Client.proxy and constants.Client.proxy.startswith("http://")), |
55 | | - ) |
| 70 | + kwargs.update(session_args_for_proxy(kwargs.get("proxy"))) |
| 71 | + |
56 | 72 | if "trace_configs" not in kwargs: |
57 | 73 | trace_config = aiohttp.TraceConfig() |
58 | 74 | trace_config.on_request_end.append(_on_request_end) |
|
0 commit comments