diff options
Diffstat (limited to 'kvmd/clients/__init__.py')
-rw-r--r-- | kvmd/clients/__init__.py | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/kvmd/clients/__init__.py b/kvmd/clients/__init__.py index 8d45fdfd..e917c9f6 100644 --- a/kvmd/clients/__init__.py +++ b/kvmd/clients/__init__.py @@ -18,3 +18,67 @@ # along with this program. If not, see <https://www.gnu.org/licenses/>. # # # # ========================================================================== # + + +import types + +from typing import Callable +from typing import Self + +import aiohttp + + +# ===== +class BaseHttpClientSession: + def __init__(self, make_http_session: Callable[[], aiohttp.ClientSession]) -> None: + self._make_http_session = make_http_session + self.__http_session: (aiohttp.ClientSession | None) = None + + def _ensure_http_session(self) -> aiohttp.ClientSession: + if not self.__http_session: + self.__http_session = self._make_http_session() + return self.__http_session + + async def close(self) -> None: + if self.__http_session: + await self.__http_session.close() + self.__http_session = None + + async def __aenter__(self) -> Self: + return self + + async def __aexit__( + self, + _exc_type: type[BaseException], + _exc: BaseException, + _tb: types.TracebackType, + ) -> None: + + await self.close() + + +class BaseHttpClient: + def __init__( + self, + unix_path: str, + timeout: float, + user_agent: str, + ) -> None: + + self.__unix_path = unix_path + self.__timeout = timeout + self.__user_agent = user_agent + + def make_session(self) -> BaseHttpClientSession: + raise NotImplementedError + + def _make_http_session(self, headers: (dict[str, str] | None)=None) -> aiohttp.ClientSession: + return aiohttp.ClientSession( + base_url="http://localhost:0", + headers={ + "User-Agent": self.__user_agent, + **(headers or {}), + }, + connector=aiohttp.UnixConnector(path=self.__unix_path), + timeout=aiohttp.ClientTimeout(total=self.__timeout), + ) |