fix(websocket): fail the connection on a non-200 h2 extended CONNECT response - #5751
Merged
Merged
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #5751 +/- ##
==========================================
+ Coverage 93.46% 93.47% +0.01%
==========================================
Files 110 110
Lines 38939 38945 +6
==========================================
+ Hits 36394 36404 +10
+ Misses 2545 2541 -4 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
metcoder95
approved these changes
Sep 3, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This relates to...
Refs #5063: fixed for
client.upgrade()in #5072, but the fetch/WebSocketpath was left out — with no assertion to crash, it hangs instead of failing.Rationale
When the server enables the extended CONNECT protocol and answers the handshake with anything but 200 (e.g. 401), the client gets no
errorand noclose: it just hangs inCONNECTINGforever, with nothing for the caller to await or catch.Standalone repro — hangs forever on
main, fails cleanly with this patchSave as
repro.mjsin the repo root and runnode repro.mjs:On
mainnothing is ever emitted:With this patch the connection fails as it should:
onRequestUpgradeinlib/web/fetch/index.jsreturnsfalsefor a non-200 h2 response, but nothing honors that return value:onUpgradeResponseinclient-h2.jsfinalizes the request regardless, so neitherresolvenorrejectever runs and the WebSocket is stranded.Changes
lib/web/fetch/index.js: abort with the existingSocketError('bad upgrade')when the h2 extended CONNECT response is not 200, so the handshake fails instead of hanging.test/websocket/opening-handshake.js: regression test — the server answers 401, assertserror+close, and times out when nothing is emitted (as onmain); passes with this patch.Features
N/A
Bug Fixes
CONNECTINGforever when the extended CONNECT response is not 200Breaking Changes and Deprecations
N/A
Assisted-by: Claude Code
Status