Files
Harvey a69a26852e Cut down unnecessary logging (#48)
* Cut down unnecessary logging

* fix format etc

* fix checks

* fix tests
2026-04-14 00:02:38 +01:00

88 lines
2.7 KiB
Python

import httpx
from typing import Optional
from core.config import Settings, get_settings
def _get_user_agent(settings: Optional[Settings] = None) -> str:
if settings:
return settings.get_user_agent()
return get_settings().get_user_agent()
class HttpClientFactory:
_clients: dict[str, httpx.AsyncClient] = {}
@classmethod
def get_client(
cls,
name: str = "default",
timeout: float = 10.0,
connect_timeout: float = 5.0,
max_connections: int = 200,
max_keepalive: int = 200,
settings: Optional[Settings] = None,
http2: bool = True,
**kwargs
) -> httpx.AsyncClient:
if name not in cls._clients:
cls._clients[name] = httpx.AsyncClient(
http2=http2,
timeout=httpx.Timeout(timeout, connect=connect_timeout),
limits=httpx.Limits(
max_connections=max_connections,
max_keepalive_connections=max_keepalive,
keepalive_expiry=60.0,
),
follow_redirects=True,
transport=httpx.AsyncHTTPTransport(http2=http2, retries=0),
headers={"User-Agent": _get_user_agent(settings)},
**kwargs
)
return cls._clients[name]
@classmethod
async def close_all(cls) -> None:
for client in cls._clients.values():
await client.aclose()
cls._clients.clear()
def get_http_client(
settings: Optional[Settings] = None,
timeout: Optional[float] = None,
connect_timeout: Optional[float] = None,
max_connections: Optional[int] = None,
) -> httpx.AsyncClient:
if settings is None:
settings = get_settings()
return HttpClientFactory.get_client(
name="default",
timeout=timeout or settings.http_timeout,
connect_timeout=connect_timeout or settings.http_connect_timeout,
max_connections=max_connections or settings.http_max_connections,
max_keepalive=settings.http_max_keepalive,
settings=settings,
)
async def close_http_clients() -> None:
await HttpClientFactory.close_all()
def get_listenbrainz_http_client(
settings: Optional[Settings] = None,
timeout: Optional[float] = None,
connect_timeout: Optional[float] = None,
) -> httpx.AsyncClient:
if settings is None:
settings = get_settings()
return HttpClientFactory.get_client(
name="listenbrainz",
timeout=timeout or settings.http_timeout,
connect_timeout=connect_timeout or settings.http_connect_timeout,
max_connections=20,
max_keepalive=20,
settings=settings,
http2=False,
)