diff --git a/packages/engine.io/lib/userver.ts b/packages/engine.io/lib/userver.ts index 71ed616fbb..54d34a6030 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 1795b00bbc..75b287c186 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);