45 lines
1.6 KiB
Python
45 lines
1.6 KiB
Python
from __future__ import annotations
|
||
|
||
import httpx
|
||
from typing import Optional, Dict, Union
|
||
import os
|
||
from agentui.config import build_httpx_proxies, get_tls_verify, is_verify_explicit
|
||
|
||
|
||
def _mask_proxy(url: str) -> str:
|
||
"""Маскируем часть с логином/паролем в URL прокси, чтобы не утекла в логи."""
|
||
try:
|
||
if "://" in url and "@" in url:
|
||
prefix, rest = url.split("://", 1)
|
||
auth, host = rest.split("@", 1)
|
||
return f"{prefix}://***@{host}"
|
||
return url
|
||
except Exception:
|
||
return "<masked>"
|
||
|
||
|
||
def build_client(timeout: float = 60.0) -> httpx.AsyncClient:
|
||
proxies: Optional[Dict[str, str]] = build_httpx_proxies()
|
||
verify: Union[bool, str] = get_tls_verify()
|
||
|
||
explicit = is_verify_explicit()
|
||
# По умолчанию при наличии прокси отключаем проверку сертификатов,
|
||
# но не трогаем, если пользователь явно задал verify или CA.
|
||
if proxies and (verify is True) and (not explicit):
|
||
verify = False
|
||
|
||
if os.getenv("AGENTUI_DEBUG", "").lower() in ("1", "true", "on", "yes"):
|
||
masked = {k: _mask_proxy(v) for k, v in (proxies or {}).items()}
|
||
print("[agentui.http_client] proxies=", masked, " verify=", verify)
|
||
|
||
# httpx сам понимает схемы socks://, socks5:// при установленном extras [socks]
|
||
client = httpx.AsyncClient(
|
||
timeout=timeout,
|
||
proxies=proxies,
|
||
follow_redirects=True,
|
||
verify=verify,
|
||
)
|
||
return client
|
||
|
||
|