67 lines
1.9 KiB
Python
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)
|