From f44a6bcc83c5fd62039f185903c15a491cdccff9 Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Sat, 31 Jan 2026 09:36:45 +0000 Subject: [PATCH] fix: route websocket upgrades through new handler API --- lib/web/fetch/index.js | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/lib/web/fetch/index.js b/lib/web/fetch/index.js index bb33e8d77e8..eb453fa79b9 100644 --- a/lib/web/fetch/index.js +++ b/lib/web/fetch/index.js @@ -2308,6 +2308,41 @@ async function httpNetworkFetch ( reject(error) }, + onRequestUpgrade (_controller, status, headers, socket) { + // We need to support 200 for websocket over h2 as per RFC-8441 + // Absence of session means H1 + if ((socket.session != null && status !== 200) || (socket.session == null && status !== 101)) { + return false + } + + const headersList = new HeadersList() + + for (const [name, value] of Object.entries(headers)) { + if (value == null) { + continue + } + + const headerName = name.toLowerCase() + + if (Array.isArray(value)) { + for (const entry of value) { + headersList.append(headerName, String(entry), true) + } + } else { + headersList.append(headerName, String(value), true) + } + } + + resolve({ + status, + statusText: STATUS_CODES[status], + headersList, + socket + }) + + return true + }, + onUpgrade (status, rawHeaders, socket) { // We need to support 200 for websocket over h2 as per RFC-8441 // Absence of session means H1