From 44ed73f53995d35ef0c8d10df6806d5687238282 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erdin=C3=A7=20C=C3=BCrebal?= Date: Wed, 4 Mar 2026 11:07:02 +0300 Subject: [PATCH] fix(eio): emit initial_headers and headers events in uServer (#5460) The uServer (uWebSockets.js) implementation did not emit "initial_headers" and "headers" events during WebSocket upgrades, unlike the regular Server which does this via the ws "headers" event. Related: https://github.com/socketio/socket.io/issues/5300 --- packages/engine.io/lib/userver.ts | 14 ++++++++++++++ packages/engine.io/test/server.js | 10 ++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/engine.io/lib/userver.ts b/packages/engine.io/lib/userver.ts index 71ed616f..54d34a60 100644 --- a/packages/engine.io/lib/userver.ts +++ b/packages/engine.io/lib/userver.ts @@ -226,9 +226,23 @@ export class uServer extends BaseServer { } } + // emit headers events for WebSocket upgrades + const additionalHeaders = {}; + const isInitialRequest = !id; + + if (isInitialRequest) { + this.emit("initial_headers", additionalHeaders, req); + } + + this.emit("headers", additionalHeaders, req); + // calling writeStatus() triggers the flushing of any header added in a middleware req.res.writeStatus("101 Switching Protocols"); + Object.keys(additionalHeaders).forEach((key) => { + req.res.writeHeader(key, additionalHeaders[key]); + }); + res.upgrade( { transport, diff --git a/packages/engine.io/test/server.js b/packages/engine.io/test/server.js index 1795b00b..75b287c1 100644 --- a/packages/engine.io/test/server.js +++ b/packages/engine.io/test/server.js @@ -3598,10 +3598,7 @@ describe("server", () => { }); it("should emit a 'initial_headers' event (websocket)", function (done) { - if ( - process.env.EIO_WS_ENGINE === "eiows" || - process.env.EIO_WS_ENGINE === "uws" - ) { + if (process.env.EIO_WS_ENGINE === "eiows") { return this.skip(); } const partialDone = createPartialDone(done, 2); @@ -3644,10 +3641,7 @@ describe("server", () => { }); it("should emit several 'headers' events per connection", function (done) { - if ( - process.env.EIO_WS_ENGINE === "eiows" || - process.env.EIO_WS_ENGINE === "uws" - ) { + if (process.env.EIO_WS_ENGINE === "eiows") { return this.skip(); } const partialDone = createPartialDone(done, 4);