Skip to content

Commit 33f5dba

Browse files
authored
[fix] Respond with the supported protocol versions (#2291)
Add the `Sec-WebSocket-Version` header, listing all supported versions, to the response if the client requested version is either invalid or unacceptable.
1 parent 22a5a17 commit 33f5dba

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

lib/websocket-server.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,11 @@ class WebSocketServer extends EventEmitter {
256256
return;
257257
}
258258

259-
if (version !== 8 && version !== 13) {
259+
if (version !== 13 && version !== 8) {
260260
const message = 'Missing or invalid Sec-WebSocket-Version header';
261-
abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);
261+
abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, {
262+
'Sec-WebSocket-Version': '13, 8'
263+
});
262264
return;
263265
}
264266

@@ -526,15 +528,23 @@ function abortHandshake(socket, code, message, headers) {
526528
* @param {Duplex} socket The socket of the upgrade request
527529
* @param {Number} code The HTTP response status code
528530
* @param {String} message The HTTP response body
531+
* @param {Object} [headers] The HTTP response headers
529532
* @private
530533
*/
531-
function abortHandshakeOrEmitwsClientError(server, req, socket, code, message) {
534+
function abortHandshakeOrEmitwsClientError(
535+
server,
536+
req,
537+
socket,
538+
code,
539+
message,
540+
headers
541+
) {
532542
if (server.listenerCount('wsClientError')) {
533543
const err = new Error(message);
534544
Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);
535545

536546
server.emit('wsClientError', err, socket, req);
537547
} else {
538-
abortHandshake(socket, code, message);
548+
abortHandshake(socket, code, message, headers);
539549
}
540550
}

test/websocket-server.test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -813,6 +813,7 @@ describe('WebSocketServer', () => {
813813

814814
req.on('response', (res) => {
815815
assert.strictEqual(res.statusCode, 400);
816+
assert.strictEqual(res.headers['sec-websocket-version'], '13, 8');
816817

817818
const chunks = [];
818819

@@ -849,6 +850,7 @@ describe('WebSocketServer', () => {
849850

850851
req.on('response', (res) => {
851852
assert.strictEqual(res.statusCode, 400);
853+
assert.strictEqual(res.headers['sec-websocket-version'], '13, 8');
852854

853855
const chunks = [];
854856

0 commit comments

Comments
 (0)