summaryrefslogtreecommitdiff
path: root/kvmd/clients/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'kvmd/clients/__init__.py')
-rw-r--r--kvmd/clients/__init__.py64
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),
+ )