Skip to content

Commit 759602e

Browse files
fix(websocket): correct argument order in WebSocketStream UTF-8 failure (#5050)
1 parent ece771c commit 759602e

2 files changed

Lines changed: 33 additions & 1 deletion

File tree

lib/web/websocket/stream/websocketstream.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ class WebSocketStream {
332332
try {
333333
chunk = utf8Decode(data)
334334
} catch {
335-
failWebsocketConnection(this.#handler, 'Received invalid UTF-8 in text frame.')
335+
failWebsocketConnection(this.#handler, 1007, 'Received invalid UTF-8 in text frame.')
336336
return
337337
}
338338
} else if (type === opcodes.BINARY) {
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'use strict'
2+
3+
const { test } = require('node:test')
4+
const { once } = require('node:events')
5+
const { WebSocketServer } = require('ws')
6+
const { WebSocketStream } = require('../../..')
7+
8+
test('WebSocketStream sends close code 1007 when receiving invalid UTF-8 in a text frame', async (t) => {
9+
const server = new WebSocketServer({ port: 0 })
10+
11+
t.after(() => server.close())
12+
13+
const connection = new Promise((resolve) => {
14+
server.on('connection', (ws) => {
15+
// Send a text frame with invalid UTF-8 payload (unmasked, server->client).
16+
// 0x81 = FIN + text opcode, 0x02 = length 2, then 0xFF 0xFE (invalid UTF-8).
17+
ws._socket.write(Buffer.from([0x81, 0x02, 0xFF, 0xFE]))
18+
resolve(ws)
19+
})
20+
})
21+
22+
const wss = new WebSocketStream(`ws://127.0.0.1:${server.address().port}`)
23+
// Swallow the expected unclean-close rejection on the client side.
24+
wss.closed.catch(() => {})
25+
26+
await wss.opened
27+
28+
const ws = await connection
29+
const [code] = await once(ws, 'close')
30+
31+
t.assert.strictEqual(code, 1007)
32+
})

0 commit comments

Comments
 (0)