2026-11-06 08:28:04 +00:00
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
import json
|
|
|
|
|
import urllib.request
|
|
|
|
|
|
|
|
|
|
SLACK = 15.0
|
2026-11-06 22:20:06 +00:00
|
|
|
GUARD = {"X-Kvb-Orchestrator": "1"}
|
2026-11-06 08:28:04 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class NoRedirect(urllib.request.HTTPRedirectHandler):
|
|
|
|
|
def redirect_request(self, req, fp, code, msg, headers, newurl):
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
OPENER = urllib.request.build_opener(urllib.request.ProxyHandler({}), NoRedirect)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def base_url(port: int) -> str:
|
|
|
|
|
return f"http://127.0.0.1:{port}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def load(request: urllib.request.Request, timeout: float) -> object:
|
|
|
|
|
with OPENER.open(request, timeout=timeout) as response:
|
|
|
|
|
return json.loads(response.read())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def call(request: urllib.request.Request, timeout: float) -> dict:
|
|
|
|
|
data = load(request, timeout)
|
|
|
|
|
if not isinstance(data, dict):
|
|
|
|
|
raise TypeError("the hub answered no object")
|
|
|
|
|
return data
|