From 894505e75142bbbf08267f09c96f406547f4243e Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Fri, 25 Sep 2026 15:44:32 -0700 Subject: [PATCH] quest(transport-upgrade): WebSocket upgrade edge cases Co-Authored-By: Claude Opus 5.5 --- quest/m1/transport-upgrade/README.md | 1 + quest/m1/transport-upgrade/polish.md | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 quest/m1/transport-upgrade/polish.md diff --git a/quest/m1/transport-upgrade/README.md b/quest/m1/transport-upgrade/README.md index 833fa9cd13..f3bd6c0174 100644 --- a/quest/m1/transport-upgrade/README.md +++ b/quest/m1/transport-upgrade/README.md @@ -58,6 +58,7 @@ Shared decisions: ## Quests +- [Rust edge cases](/quest/m1/transport-upgrade/polish.md) - no false GOAWAY warning on upgrade, and a failed WebSocket handshake falls back to the pending QUIC dial - [JavaScript](/quest/m1/transport-upgrade/js.md) - js/net keeps the WebTransport dial after WebSocket wins and migrates through the client-goaway handover ## Related diff --git a/quest/m1/transport-upgrade/polish.md b/quest/m1/transport-upgrade/polish.md new file mode 100644 index 0000000000..9a3c1b602f --- /dev/null +++ b/quest/m1/transport-upgrade/polish.md @@ -0,0 +1,24 @@ +# [S] WebSocket upgrade edge cases + +## Goal + +The Rust WebSocket-to-QUIC upgrade leaves no false warnings and no avoidable +failures: a GOAWAY the peer received is not logged as a send failure, and a +WebSocket handshake that fails after WebSocket won the dial race falls back to +the still-pending QUIC dial instead of failing the connection attempt. + +## Plan + +- Every upgrade logs `failed to send goaway: transport: connection closed` + although the server receives it. Find why the send reports failure (likely + the close racing the flush) and fix it at the source. +- When WebSocket wins the race but its MoQ handshake fails, the pending QUIC + dial is still alive; use it rather than failing, bounded by the existing + connect timeout. +- Tests for both, including the deterministic QUIC-held forwarder from #4189. + +Public API: none. Wire: none. + +## Related + +- [#4189](https://github.com/moq-dev/moq/pull/4189) - the WebSocket-to-QUIC upgrade this polish quest follows