Skip to content

Commit dfe3122

Browse files
fix: prevent crash when using custom headers
It seems that the Deno.upgradeWebSocket() method does not allow to provide additional headers during the WebSocket handshake. Exception: > TypeError: Headers are immutable. > at Headers.set (deno:ext/fetch/20_headers.js:384:15) > at /packages/engine.io/lib/transports/websocket.ts:60:24 > at Headers.forEach (deno:ext/webidl/00_webidl.js:1001:13) > at WS.onRequest (/packages/engine.io/lib/transports/websocket.ts:59:21) > at Server.handshake (/packages/engine.io/lib/server.ts:344:31)
1 parent 193a9b5 commit dfe3122

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed

packages/engine.io/lib/server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ export class Server extends EventEmitter<never, never, ServerReservedEvents> {
214214
if (req.headers.has("upgrade")) {
215215
const transport = new WS(this.opts);
216216

217-
const promise = transport.onRequest(req, responseHeaders);
217+
const promise = transport.onRequest(req);
218218

219219
socket._maybeUpgrade(transport);
220220

packages/engine.io/lib/transports/websocket.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export class WS extends Transport {
2323
}
2424
}
2525

26-
public onRequest(req: Request, responseHeaders: Headers): Promise<Response> {
26+
public onRequest(req: Request): Promise<Response> {
2727
const { socket, response } = Deno.upgradeWebSocket(req);
2828

2929
this.socket = socket;
@@ -56,9 +56,7 @@ export class WS extends Transport {
5656
this.onClose();
5757
};
5858

59-
responseHeaders.forEach((value, key) => {
60-
response.headers.set(key, value);
61-
});
59+
// note: response.headers is immutable, so it seems we can't add headers here
6260

6361
return Promise.resolve(response);
6462
}

packages/engine.io/test/response_headers.test.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import { assertEquals, describe, it } from "../../../test_deps.ts";
22
import { Server } from "../lib/server.ts";
3-
import { enableLogs, parseSessionID, testServe } from "./util.ts";
3+
import {
4+
enableLogs,
5+
parseSessionID,
6+
testServe,
7+
testServeWithAsyncResults,
8+
} from "./util.ts";
49

510
await enableLogs();
611

@@ -43,4 +48,23 @@ describe("response headers", () => {
4348
await dataResponse.body?.cancel();
4449
});
4550
});
51+
52+
it("should not crash when using WebSocket (noop)", () => {
53+
const engine = new Server({
54+
editHandshakeHeaders: (responseHeaders) => {
55+
responseHeaders.set("abc", "123");
56+
},
57+
editResponseHeaders: (responseHeaders) => {
58+
responseHeaders.set("def", "456");
59+
},
60+
});
61+
62+
return testServeWithAsyncResults(engine, 1, (port, done) => {
63+
const socket = new WebSocket(
64+
`ws://localhost:${port}/engine.io/?EIO=4&transport=websocket`,
65+
);
66+
67+
socket.onopen = done;
68+
});
69+
});
4670
});

0 commit comments

Comments
 (0)