{"record":{"id":"4267cf254ac13988","repo":"MemPalace/mempalace","slug":"url-exc","errorCode":null,"errorMessage":"{url}: {exc}","messagePattern":"\\{url\\}: \\{exc\\}","errorType":"exception","errorClass":"TransportError","httpStatus":null,"severity":"error","filePath":"mempalace/transport.py","lineNumber":103,"sourceCode":"    for peer in peers:\n        if not isinstance(peer, dict) or not peer.get(\"url\"):\n            raise ValueError(f\"{path}: every peer needs at least a 'url'\")\n    return peers\n\n\ndef http_request(base_url: str, token: str, path: str, params: dict = None) -> dict:\n    \"\"\"The HTTPS wire primitive: one bearer-authenticated GET, JSON back.\"\"\"\n    url = base_url.rstrip(\"/\") + path\n    if params:\n        url += \"?\" + urllib.parse.urlencode(params)\n    request = urllib.request.Request(url)\n    if token:\n        request.add_header(\"Authorization\", f\"Bearer {token}\")\n    try:\n        with urllib.request.urlopen(request, timeout=_http_timeout_s()) as response:\n            return json.loads(response.read().decode(\"utf-8\"))\n    except (urllib.error.URLError, TimeoutError, ValueError) as exc:\n        raise TransportError(f\"{url}: {exc}\") from None\n\n\nclass Transport(ABC):\n    \"\"\"The seam. Layer 2 holds one of these and nothing else network-shaped.\"\"\"\n\n    @abstractmethod\n    def self_id(self) -> str:\n        \"\"\"Stable ReplicaId of this node.\"\"\"\n\n    @abstractmethod\n    def peers(self) -> list[dict]:\n        \"\"\"Current membership snapshot. Each peer dict carries at least\n        ``name``; transport-specific addressing fields are opaque to\n        Layer 2, which only ever hands the dict back to :meth:`request`.\"\"\"\n\n    @abstractmethod\n    def request(self, peer: dict, path: str, params: Optional[dict] = None) -> dict:\n        \"\"\"One authenticated round-trip to ``peer``. Raises TransportError.\"\"\"","sourceCodeStart":85,"sourceCodeEnd":121,"githubUrl":"https://github.com/MemPalace/mempalace/blob/06cb6987f02610784fefbad4b2bd5d026d164ba6/mempalace/transport.py#L85-L121","documentation":"Error \"{url}: {exc}\" thrown in MemPalace/mempalace.","triggerScenarios":"Thrown at mempalace/transport.py:103 when the library encounters an invalid state.","commonSituations":"Request to a sync peer failed.","solutions":["Check the peer URL and that the peer is reachable"],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"06cb6987f02610784fefbad4b2bd5d026d164ba6","analyzedAt":"2026-08-15T03:03:36.213Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}