pyh0n/pyhon/connection/handler/base.py

78 lines
2.4 KiB
Python
Raw Normal View History

2023-04-15 17:52:04 +05:30
import logging
from collections.abc import AsyncIterator
from contextlib import asynccontextmanager
2023-06-28 22:32:11 +05:30
from types import TracebackType
from typing import Optional, Dict, Type, Any, Protocol
2023-04-15 17:52:04 +05:30
import aiohttp
from typing_extensions import Self
2023-06-28 23:55:52 +05:30
from yarl import URL
2023-04-15 17:52:04 +05:30
from pyhon import const, exceptions
2023-06-28 22:32:11 +05:30
from pyhon.typedefs import Callback
2023-04-15 17:52:04 +05:30
_LOGGER = logging.getLogger(__name__)
class ConnectionHandler:
2023-06-28 22:32:11 +05:30
_HEADERS: Dict[str, str] = {
2023-04-15 17:52:04 +05:30
"user-agent": const.USER_AGENT,
"Content-Type": "application/json",
}
def __init__(self, session: Optional[aiohttp.ClientSession] = None) -> None:
self._create_session: bool = session is None
self._session: Optional[aiohttp.ClientSession] = session
async def __aenter__(self) -> Self:
return await self.create()
2023-06-28 22:32:11 +05:30
async def __aexit__(
self,
exc_type: Optional[Type[BaseException]],
exc: Optional[BaseException],
traceback: Optional[TracebackType],
) -> None:
2023-04-15 17:52:04 +05:30
await self.close()
2023-06-28 22:32:11 +05:30
@property
def session(self) -> aiohttp.ClientSession:
if self._session is None:
raise exceptions.NoSessionException
return self._session
2023-04-15 17:52:04 +05:30
async def create(self) -> Self:
if self._create_session:
self._session = aiohttp.ClientSession()
return self
@asynccontextmanager
2023-06-28 22:32:11 +05:30
def _intercept(
2023-06-28 23:55:52 +05:30
self, method: Callback, url: str | URL, *args: Any, **kwargs: Dict[str, Any]
2023-06-28 22:32:11 +05:30
) -> AsyncIterator[aiohttp.ClientResponse]:
2023-04-15 17:52:04 +05:30
raise NotImplementedError
@asynccontextmanager
2023-06-28 22:32:11 +05:30
async def get(
self, *args: Any, **kwargs: Any
) -> AsyncIterator[aiohttp.ClientResponse]:
2023-04-15 17:52:04 +05:30
if self._session is None:
raise exceptions.NoSessionException()
2023-04-15 19:25:22 +05:30
response: aiohttp.ClientResponse
2023-06-28 22:32:11 +05:30
async with self._intercept(self._session.get, *args, **kwargs) as response: # type: ignore[arg-type]
2023-04-15 17:52:04 +05:30
yield response
@asynccontextmanager
2023-06-28 22:32:11 +05:30
async def post(
self, *args: Any, **kwargs: Any
) -> AsyncIterator[aiohttp.ClientResponse]:
2023-04-15 17:52:04 +05:30
if self._session is None:
raise exceptions.NoSessionException()
2023-04-15 19:25:22 +05:30
response: aiohttp.ClientResponse
2023-06-28 22:32:11 +05:30
async with self._intercept(self._session.post, *args, **kwargs) as response: # type: ignore[arg-type]
2023-04-15 17:52:04 +05:30
yield response
async def close(self) -> None:
if self._create_session and self._session is not None:
await self._session.close()