Skip to content

Commit 7df6442

Browse files
committed
fix: adapt websocket frame-limit handling for v6 parser
Signed-off-by: Matteo Collina <hello@matteocollina.com>
1 parent 4e0179a commit 7df6442

File tree

2 files changed

+17
-18
lines changed

2 files changed

+17
-18
lines changed

lib/web/websocket/receiver.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ const {
1818
const { WebsocketFrameSend } = require('./frame')
1919
const { closeWebSocketConnection } = require('./connection')
2020
const { PerMessageDeflate } = require('./permessage-deflate')
21-
const { MessageSizeExceededError } = require('../../core/errors')
2221

2322
// This code was influenced by ws released under the MIT license.
2423
// Copyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>
@@ -232,9 +231,7 @@ class ByteParser extends Writable {
232231
} else {
233232
this.#extensions.get('permessage-deflate').decompress(body, this.#info.fin, (error, data) => {
234233
if (error) {
235-
// Use 1009 (Message Too Big) for decompression size limit errors
236-
const code = error instanceof MessageSizeExceededError ? 1009 : 1007
237-
closeWebSocketConnection(this.ws, code, error.message, error.message.length)
234+
failWebsocketConnection(this.ws, error.message)
238235
return
239236
}
240237

test/websocket/receiver-unit.js

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,39 @@
22

33
const { test } = require('node:test')
44
const { ByteParser } = require('../../lib/web/websocket/receiver')
5-
const { states } = require('../../lib/web/websocket/constants')
5+
const { kController, kResponse } = require('../../lib/web/websocket/symbols')
66

77
const invalidFrame = Buffer.from([0x82, 0x7F, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01])
88

99
test('ByteParser rejects 64-bit payload lengths with a non-zero upper word', (t) => {
1010
const calls = {
1111
abort: 0,
12-
close: 0
12+
destroy: 0
1313
}
1414

15-
const handler = {
16-
readyState: states.CONNECTING,
17-
controller: {
18-
abort: () => {
19-
calls.abort += 1
15+
const ws = new EventTarget()
16+
ws[kController] = {
17+
abort: () => {
18+
calls.abort += 1
19+
}
20+
}
21+
ws[kResponse] = {
22+
socket: {
23+
destroyed: false,
24+
destroy: () => {
25+
calls.destroy += 1
2026
}
21-
},
22-
onSocketClose: () => {
23-
calls.close += 1
24-
},
25-
closeState: new Set()
27+
}
2628
}
2729

28-
const parser = new ByteParser(handler)
30+
const parser = new ByteParser(ws)
2931

3032
parser.write(invalidFrame)
3133

3234
return new Promise((resolve) => {
3335
setImmediate(() => {
3436
t.assert.strictEqual(calls.abort, 1)
35-
t.assert.strictEqual(calls.close, 1)
37+
t.assert.strictEqual(calls.destroy, 1)
3638
parser.destroy()
3739
resolve()
3840
})

0 commit comments

Comments
 (0)