Skip to content

fix(relay): default interop image to WebTransport at root path#34

Merged
floatdrop merged 2 commits into
draft-18from
fix/interop-relay-webtransport-defaults
Jun 29, 2026
Merged

fix(relay): default interop image to WebTransport at root path#34
floatdrop merged 2 commits into
draft-18from
fix/interop-relay-webtransport-defaults

Conversation

@floatdrop

Copy link
Copy Markdown
Owner

Problem

The 2026-06-29 interop run had moq-go failing every docker pairing, including moq-go → moq-go (0/6) — a same-implementation pairing failing points at our own image, not a peer.

The runner's docker harness (docker-compose.test.yml + make test) is hardwired to one transport: the client's RELAY_URL defaults to https://relay:4443 (WebTransport, ALPN h3) and there is no env knob to tell the relay which transport to serve. But the interop relay image defaulted to:

  • MOQT_TRANSPORT=quic → relay advertised only the raw moqt-* ALPNs, so every h3 ClientHello was rejected with CRYPTO_ERROR 0x178 ... tls: no application protocol.
  • MOQT_WEBTRANSPORT_PATH=/moq → after fixing the ALPN, the client's path-less CONNECT targets / and 404s against the /moq-only handler.

Both defaults assumed a configuration the harness never produces.

Fix

  • entrypoint-relay.sh + Dockerfile: default MOQT_TRANSPORT=webtransport and MOQT_WEBTRANSPORT_PATH=/ to match the harness.
  • main.go: skip the / catch-all 404 handler when the WebTransport path is / (registering two handlers on / panics the ServeMux; a root-mounted upgrade already covers everything). This makes -webtransport-path / work at all.

The -webtransport / -webtransport-path /moq binary flag defaults are unchanged, so local go run ./cmd/relay is unaffected — only the interop image defaults move.

Verification

Reproduced the original failure through the runner's compose, then re-ran after the fix:

ok 1 - setup-only … ok 6 - subscribe-before-announce   → 6/6, exit 0

go build ./..., relay/wtconn tests, and gofmt all clean. This resolves the entire → moq-go relay column in the matrix (every client dialing a moq-go relay in docker), not just the self-test.

Out of scope (peer-side, not moq-go bugs)

When moq-go is the docker client: moq-go → moq-rs-draft-18/moq-dev-rs time out waiting for HTTP/3 settings (peer relays don't answer the WT dial), and moq-go → aiomoqt-relay reports server didn't enable WebTransport (aiomoqt's H3 SETTINGS omit the WT-enable flags webtransport-go's Dialer requires). Worth raising upstream; nothing to change here.

🤖 Generated with Claude Code

floatdrop and others added 2 commits June 29, 2026 12:59
The moq-interop-runner's docker harness dials the relay at a path-less
https://relay:4443 (WebTransport, ALPN "h3") and provides no env knob to
select the relay's transport. The interop relay image defaulted to raw
QUIC (MOQT_TRANSPORT=quic), so it advertised only the moqt-* ALPNs and
rejected every h3 ClientHello with "tls: no application protocol" — every
client connecting to a moq-go relay in docker failed, including
moq-go -> moq-go (0/6).

Default the interop entrypoint/Dockerfile to MOQT_TRANSPORT=webtransport
and MOQT_WEBTRANSPORT_PATH=/ to match the harness, and skip the relay's
"/" catch-all 404 handler when the WebTransport path is "/" (registering
two handlers for the same pattern panics the ServeMux; a root-mounted
upgrade already covers every request). The -webtransport and
-webtransport-path binary flag defaults are unchanged, so local
`go run ./cmd/relay` is unaffected.

Verified through the runner's compose: moq-go -> moq-go docker goes from
0/6 to 6/6.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Flipping the relay image default to WebTransport (so the external
moq-interop-runner, which has no transport knob, can reach it) broke this
repo's own "our client → our relay" CI job: `make interop-client` defaults
to a raw-QUIC loopback (moqt://relay:4443), and its relay relied on the
image's old quic default. With the relay now defaulting to WebTransport it
advertised only h3, so the moqt:// client failed with "tls: no application
protocol".

docker-compose.client.yml now defaults the relay's MOQT_TRANSPORT to quic
(matching the moqt:// loopback URL), and the Makefile derives it from
CLIENT_RELAY_URL's scheme so an https:// override stays consistent.
Third-party relay images ignore MOQT_TRANSPORT. interop/docker-compose.yml
already forwarded MOQT_TRANSPORT, so interop-quic/interop-webtransport are
unaffected.

Verified: `make interop-client` loopback passes 6/6 with the relay in QUIC
mode.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@floatdrop floatdrop merged commit 3e84bf0 into draft-18 Jun 29, 2026
9 checks passed
@floatdrop floatdrop deleted the fix/interop-relay-webtransport-defaults branch June 29, 2026 12:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant