websockets / ws

Simple to use, blazing fast and thoroughly tested WebSocket client and server for Node.js
MIT License
21.34k stars 2.3k forks source link

RangeError: Invalid WebSocket frame: MASK must be set #2220

Closed fishcharlie closed 2 months ago

fishcharlie commented 2 months ago

Is there an existing issue for this?

Description

No response

ws version

8.14.2

Node.js Version

20.10.0

System

System: OS: Linux 5.15 Debian GNU/Linux 12 (bookworm) 12 (bookworm) CPU: (4) x64 DO-Premium-Intel Memory: 1.80 GB / 7.75 GB Container: Yes Shell: 5.2.15 - /bin/bash

Expected result

Server to not crash when client sends invalid message.

Actual result

Server crashes:

server-1  | 2024-04-14T20:59:43.651358427Z node:events:492
server-1  | 2024-04-14T20:59:43.651400706Z       throw er; // Unhandled 'error' event
server-1  | 2024-04-14T20:59:43.651404395Z       ^
server-1  | 2024-04-14T20:59:43.651407281Z
server-1  | 2024-04-14T20:59:43.651409956Z RangeError: Invalid WebSocket frame: MASK must be set
server-1  | 2024-04-14T20:59:43.651412820Z     at Receiver.getInfo (/project/node_modules/ws/lib/receiver.js:321:16)
server-1  | 2024-04-14T20:59:43.651416121Z     at Receiver.startLoop (/project/node_modules/ws/lib/receiver.js:155:22)
server-1  | 2024-04-14T20:59:43.651419176Z     at Receiver._write (/project/node_modules/ws/lib/receiver.js:93:10)
server-1  | 2024-04-14T20:59:43.651421787Z     at writeOrBuffer (node:internal/streams/writable:556:12)
server-1  | 2024-04-14T20:59:43.651424409Z     at _write (node:internal/streams/writable:490:10)
server-1  | 2024-04-14T20:59:43.651427009Z     at Writable.write (node:internal/streams/writable:494:10)
server-1  | 2024-04-14T20:59:43.651429675Z     at Socket.socketOnData (/project/node_modules/ws/lib/websocket.js:1286:35)
server-1  | 2024-04-14T20:59:43.651432302Z     at Socket.emit (node:events:514:28)
server-1  | 2024-04-14T20:59:43.651434905Z     at addChunk (node:internal/streams/readable:545:12)
server-1  | 2024-04-14T20:59:43.651437500Z     at readableAddChunkPushByteMode (node:internal/streams/readable:495:3)
server-1  | 2024-04-14T20:59:43.651451419Z Emitted 'error' event on WebSocket instance at:
server-1  | 2024-04-14T20:59:43.651454706Z     at Receiver.receiverOnError (/project/node_modules/ws/lib/websocket.js:1172:13)
server-1  | 2024-04-14T20:59:43.651457381Z     at Receiver.emit (node:events:514:28)
server-1  | 2024-04-14T20:59:43.651459909Z     at emitErrorNT (node:internal/streams/destroy:151:8)
server-1  | 2024-04-14T20:59:43.651462416Z     at emitErrorCloseNT (node:internal/streams/destroy:116:3)
server-1  | 2024-04-14T20:59:43.651464953Z     at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
server-1  | 2024-04-14T20:59:43.651467678Z   code: 'WS_ERR_EXPECTED_MASK',
server-1  | 2024-04-14T20:59:43.651470327Z   [Symbol(status-code)]: 1002
server-1  | 2024-04-14T20:59:43.651472922Z }
server-1  | 2024-04-14T20:59:43.651476814Z
server-1  | 2024-04-14T20:59:43.651479782Z Node.js v20.10.0

Attachments

No response

lpinca commented 2 months ago

Add a listener for the 'error' event to the WebSocket object.

const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 0 }, function () {
  const ws = new WebSocket(`ws://127.0.0.1:${server.address().port}`)

  ws.on('open', function () {
    ws._socket.write(Buffer.from('8200','hex'));
  });
});

server.on('connection', function (ws) {
  ws.on('error', console.error);
});