|
38 | 38 | import httpx |
39 | 39 | import distro |
40 | 40 | import pydantic |
41 | | -from httpx import URL |
| 41 | +from httpx import URL, Proxy, HTTPTransport, AsyncHTTPTransport |
42 | 42 | from pydantic import PrivateAttr |
43 | 43 |
|
44 | 44 | from . import _exceptions |
|
86 | 86 | APIConnectionError, |
87 | 87 | APIResponseValidationError, |
88 | 88 | ) |
| 89 | +from ._utils._httpx import get_environment_proxies |
89 | 90 | from ._legacy_response import LegacyAPIResponse |
90 | 91 |
|
91 | 92 | log: logging.Logger = logging.getLogger(__name__) |
@@ -826,11 +827,24 @@ def __init__(self, **kwargs: Any) -> None: |
826 | 827 | if TCP_KEEPIDLE is not None: |
827 | 828 | socket_options.append((socket.IPPROTO_TCP, TCP_KEEPIDLE, 60)) |
828 | 829 |
|
829 | | - kwargs["transport"] = httpx.HTTPTransport( |
830 | | - # note: limits is always set above |
831 | | - limits=kwargs["limits"], |
832 | | - socket_options=socket_options, |
833 | | - ) |
| 830 | + proxy_map = {key: None if url is None else Proxy(url=url) for key, url in get_environment_proxies().items()} |
| 831 | + |
| 832 | + transport_kwargs = { |
| 833 | + arg: kwargs[arg] for arg in ("verify", "cert", "trust_env", "http1", "http2", "limits") if arg in kwargs |
| 834 | + } |
| 835 | + |
| 836 | + proxy_mounts = { |
| 837 | + key: None if proxy is None else HTTPTransport(proxy=proxy, **transport_kwargs) |
| 838 | + for key, proxy in proxy_map.items() |
| 839 | + } |
| 840 | + default_transport = HTTPTransport(**transport_kwargs) |
| 841 | + |
| 842 | + # Prioritize the mounts set by the user over the environment variables. |
| 843 | + proxy_mounts.update(kwargs.get("mounts", {})) |
| 844 | + kwargs["mounts"] = proxy_mounts |
| 845 | + |
| 846 | + # Sets the default transport so that HTTPX won't automatically configure proxies. |
| 847 | + kwargs["transport"] = kwargs.get("transport", default_transport) |
834 | 848 |
|
835 | 849 | super().__init__(**kwargs) |
836 | 850 |
|
@@ -1367,11 +1381,24 @@ def __init__(self, **kwargs: Any) -> None: |
1367 | 1381 | if TCP_KEEPIDLE is not None: |
1368 | 1382 | socket_options.append((socket.IPPROTO_TCP, TCP_KEEPIDLE, 60)) |
1369 | 1383 |
|
1370 | | - kwargs["transport"] = httpx.AsyncHTTPTransport( |
1371 | | - # note: limits is always set above |
1372 | | - limits=kwargs["limits"], |
1373 | | - socket_options=socket_options, |
1374 | | - ) |
| 1384 | + proxy_map = {key: None if url is None else Proxy(url=url) for key, url in get_environment_proxies().items()} |
| 1385 | + |
| 1386 | + transport_kwargs = { |
| 1387 | + arg: kwargs[arg] for arg in ("verify", "cert", "trust_env", "http1", "http2", "limits") if arg in kwargs |
| 1388 | + } |
| 1389 | + |
| 1390 | + proxy_mounts = { |
| 1391 | + key: None if proxy is None else AsyncHTTPTransport(proxy=proxy, **transport_kwargs) |
| 1392 | + for key, proxy in proxy_map.items() |
| 1393 | + } |
| 1394 | + default_transport = AsyncHTTPTransport(**transport_kwargs) |
| 1395 | + |
| 1396 | + # Prioritize the mounts set by the user over the environment variables. |
| 1397 | + proxy_mounts.update(kwargs.get("mounts", {})) |
| 1398 | + kwargs["mounts"] = proxy_mounts |
| 1399 | + |
| 1400 | + # Sets the default transport so that HTTPX won't automatically configure proxies. |
| 1401 | + kwargs["transport"] = kwargs.get("transport", default_transport) |
1375 | 1402 |
|
1376 | 1403 | super().__init__(**kwargs) |
1377 | 1404 |
|
|
0 commit comments