Files
overub/core/http.py
2025-12-21 17:12:32 +01:00

67 lines
1.9 KiB
Python

import json
from typing import Optional, Any
from core.logger import get_logger
logger = get_logger("core.http")
class SessionManager:
def __init__(self) -> None:
self._session: Optional[object] = None
async def get_session(self) -> Optional[object]:
if self._session:
return self._session
try:
import aiohttp
except ImportError:
logger.warning("aiohttp not installed")
return None
self._session = aiohttp.ClientSession()
return self._session
async def close(self) -> None:
if self._session:
await self._session.close()
self._session = None
async def get_json(self, url: str) -> Optional[Any]:
session = await self.get_session()
if session:
async with session.get(url) as response:
return await response.json()
try:
from urllib import request
except Exception:
return None
loop = __import__("asyncio").get_event_loop()
return await loop.run_in_executor(None, self._sync_get_json, url)
def _sync_get_json(self, url: str) -> Optional[Any]:
from urllib import request
with request.urlopen(url) as response:
payload = response.read().decode("utf-8")
try:
return json.loads(payload)
except json.JSONDecodeError:
return None
class RestrictedSession:
def __init__(self, manager: SessionManager, allow_network: bool) -> None:
self.manager = manager
self.allow_network = allow_network
async def get_session(self) -> Optional[object]:
if not self.allow_network:
return None
return await self.manager.get_session()
async def get_json(self, url: str) -> Optional[Any]:
if not self.allow_network:
raise RuntimeError("Network access disabled for plugins")
return await self.manager.get_json(url)