test: verify HTTP2 proxy negotiation

This commit is contained in:
2026-09-22 23:43:34 +08:00
parent ca0e1d6b92
commit 64a9fde204

View File

@@ -73,6 +73,7 @@ http {{
server {{
listen 127.0.0.1:{edge_port} ssl;
http2 on;
ssl_certificate /etc/nginx/certs/cert.pem;
ssl_certificate_key /etc/nginx/certs/key.pem;
@@ -146,6 +147,28 @@ def wait_for_proxy(edge_port: int, timeout: float) -> None:
raise RuntimeError(f"Nginx proxy did not become healthy: {last_error}")
def verify_http2(edge_port: int) -> None:
expected = b'{"code":"OK","message":"success","data":{"status":"ok"},"requestId":"proxyCheck"}\n'
result = subprocess.run(
[
"curl", "--silent", "--show-error", "--fail", "--http2", "--insecure",
"-H", "X-Request-ID: proxyCheck", "-w", "\\n%{http_version}",
f"https://127.0.0.1:{edge_port}/health",
],
capture_output=True,
check=False,
)
if result.returncode != 0:
raise AssertionError(f"HTTP/2 curl failed: {result.stderr.decode(errors='replace')}")
output = result.stdout
try:
body, version = output.rsplit(b"\n", 1)
except ValueError as error:
raise AssertionError(f"HTTP/2 curl output missing protocol version: {output!r}") from error
if version != b"2" or body != expected:
raise AssertionError(f"expected HTTP/2 response, got version={version!r} body={body!r}")
def verify_timeout(edge_port: int) -> None:
context = ssl._create_unverified_context()
connection = http.client.HTTPSConnection("127.0.0.1", edge_port, context=context, timeout=3)
@@ -166,6 +189,8 @@ def main() -> None:
raise SystemExit("docker is required for proxy verification")
if shutil.which("openssl") is None:
raise SystemExit("openssl is required for proxy verification")
if shutil.which("curl") is None:
raise SystemExit("curl with HTTP/2 support is required for proxy verification")
if not Path("/proc").exists():
raise SystemExit("proxy verification must run on Linux")
@@ -231,6 +256,8 @@ def main() -> None:
raise RuntimeError(
f"{error}; nginx logs={nginx_logs!r}; backend logs={backend_logs!r}"
) from error
verify_http2(edge_port)
print("PASS Nginx HTTP/2 edge negotiation and HTTP/1.1 native backhaul", flush=True)
verify_keep_alive(edge_port)
verify_timeout(edge_port)
print("PASS Nginx TLS proxy, Keep-Alive and upstream timeout", flush=True)