From e0ea85005d667451f8799631bd5b185b3658a034 Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Sun, 30 Aug 2026 14:11:24 +0000 Subject: [PATCH] =?UTF-8?q?fix(discord-bridge):=20dashboard-ul=20ramanea?= =?UTF-8?q?=20gol=20la=20/claude=20=E2=80=94=20lipsea=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Simptom: pagina se incarca prin tailscale, dar niciun API nu era cerut; in dashboard.log se vedea doar GET / si nimic altceva. Cauza: --set-path taie prefixul, deci /claude si /claude/ ajung la server identic, ca "/". Fara slash final, URL-urile relative se rezolvau la radacina hostului (https://host/api/status), unde proxy-ul nu trimite nimic incoace. Cererile nici nu ajungeau la noi, iar pagina ramanea goala fara nicio eroare. Redirectul 301 adaugat anterior nu putea ajuta: serverul nu vede forma originala a adresei. Paginile se servesc acum printr-un handler propriu care pune din DASHBOARD_PREFIX, plus Cache-Control: no-store, fiindca HTML-ul poarta de acum configuratie si o copie veche ar trimite cererile aiurea. Patru teste noi. Verificat in browser pe cazul reprodus (pagina servita pe radacina, ca prin proxy): toate cererile pleaca cu /claude/ si datele se incarca. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01B29CApsP1JkSdjYaGaHpE7 --- .../discord-bridge/dashboard/api.py | 36 ++++++++++++++++++- .../discord-bridge/tests/test_dashboard.py | 26 ++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/proxmox/lxc171-claude-agent/discord-bridge/dashboard/api.py b/proxmox/lxc171-claude-agent/discord-bridge/dashboard/api.py index 52b5004..b629f69 100644 --- a/proxmox/lxc171-claude-agent/discord-bridge/dashboard/api.py +++ b/proxmox/lxc171-claude-agent/discord-bridge/dashboard/api.py @@ -426,9 +426,43 @@ class Handler(SimpleHTTPRequestHandler): self.send_header("Content-Length", "0") self.end_headers() return - self.path = "/index.html" if path == "/" else path + if path in ("/", "/index.html"): + return self.send_html("index.html") + if path == "/login.html": + return self.send_html("login.html") + self.path = path return super().do_GET() + def send_html(self, name: str): + """Trimite o pagina, cu `` pus la servire. + + De ce e nevoie: `tailscale serve --set-path /claude` TAIE prefixul, deci + serverul nu poate sti daca browserul e la `/claude` sau la `/claude/` — + ambele ajung aici ca `/`. Fara slash final, un URL relativ (`api/status`) + se rezolva la radacina hostului, unde proxy-ul nu mai trimite nimic + incoace: pagina se incarca si ramane goala, fara nicio eroare vizibila. + `` fixeaza rezolvarea indiferent de forma adresei. + """ + try: + body = (_DASH / name).read_text(encoding="utf-8") + except OSError: + return self.send_error(404) + pfx = mount_prefix() + if pfx: + body = body.replace("", f'\n', 1) + data = body.encode("utf-8") + self.send_response(200) + self.send_header("Content-Type", "text/html; charset=utf-8") + self.send_header("Content-Length", str(len(data))) + # no-store: paginile poarta acum si configuratia (base href), deci o + # copie veche din cache ar trimite cererile in alta parte. + self.send_header("Cache-Control", "no-store") + self.end_headers() + try: + self.wfile.write(data) + except (BrokenPipeError, ConnectionResetError): + pass + def route_get(self, path: str): qs = parse_qs(urlparse(self.path).query) if path == "/api/status": diff --git a/proxmox/lxc171-claude-agent/discord-bridge/tests/test_dashboard.py b/proxmox/lxc171-claude-agent/discord-bridge/tests/test_dashboard.py index e3638fb..fe7fe60 100644 --- a/proxmox/lxc171-claude-agent/discord-bridge/tests/test_dashboard.py +++ b/proxmox/lxc171-claude-agent/discord-bridge/tests/test_dashboard.py @@ -381,3 +381,29 @@ def test_static_servit_si_sub_prefix(server_cu_prefix): server_cu_prefix.login() status, data, _ = server_cu_prefix.call("/claude/static/app.css") assert status == 200 and ".card" in data["_html"] + + +def test_base_href_pus_cand_exista_prefix(server_cu_prefix): + """Proxy-ul taie prefixul, deci serverul nu poate sti daca browserul e la + `/claude` sau `/claude/`. `` face rezolvarea determinista.""" + server_cu_prefix.login() + _, data, _ = server_cu_prefix.call("/") + assert '' in data["_html"] + + +def test_base_href_si_pe_pagina_de_login(server_cu_prefix): + _, data, _ = server_cu_prefix.call("/login.html") + assert '' in data["_html"] + + +def test_fara_prefix_nu_se_pune_base(server): + server.login() + _, data, _ = server.call("/") + assert "