diff --git a/tests/cli/test_frontend_agent_proxy.py b/tests/cli/test_frontend_agent_proxy.py index 09f762da..9911773c 100644 --- a/tests/cli/test_frontend_agent_proxy.py +++ b/tests/cli/test_frontend_agent_proxy.py @@ -45,6 +45,26 @@ def test_agent_surface_rewrite_only_changes_the_agent_base_path() -> None: assert f'src="{prefix}/hermes/assets/app.js"' in rewritten +def test_hermes_surface_rewrite_removes_private_gateway_query() -> None: + prefix = "/web/hermes/sessions/session-1/surface/token-1" + body = ( + b'' + b'' + b'' + ) + + rewritten = _rewrite_body(body, "text/html", prefix, "hermes").decode() + + assert f'src="{prefix}/hermes/assets/app.js?theme=dark"' in rewritten + assert 'href="./assets/app.css"' in rewritten + assert 'href="./favicon.ico"' in rewritten + assert "faasInstanceName" not in rewritten + assert "Authorization" not in rewritten + assert "hermes-instance" not in rewritten + assert "hermes-secret" not in rewritten + + def test_agent_surface_proxy_keeps_endpoint_auth_server_side( monkeypatch: pytest.MonkeyPatch, ) -> None: diff --git a/veadk/cli/frontend_agent_proxy.py b/veadk/cli/frontend_agent_proxy.py index 7a808893..9eeadb52 100644 --- a/veadk/cli/frontend_agent_proxy.py +++ b/veadk/cli/frontend_agent_proxy.py @@ -18,6 +18,8 @@ import asyncio import contextlib +import html +import re from collections.abc import Callable from urllib.parse import parse_qsl, urlencode, urlsplit, urlunsplit @@ -33,6 +35,11 @@ _MAX_BODY_BYTES = 16 * 1024 * 1024 _TEXT_CONTENT_TYPES = ("text/", "javascript", "json", "manifest", "xml") +_GATEWAY_QUERY_KEYS = frozenset({"authorization", "faasinstancename"}) +_HERMES_QUERY_URL_PATTERN = re.compile( + rb"[^\s\"'`<>()]+\?[^\s\"'`<>()]+", + re.IGNORECASE, +) _OPENCLAW_RESET_TAG = ( b"