From 8ca0d47ffe926a108a72d17647d75748962b8112 Mon Sep 17 00:00:00 2001 From: Sten Reijers Date: Mon, 18 Jun 2018 10:49:34 +0200 Subject: [PATCH 1/6] Added options.maxPayload for websocket clients --- lib/websocket.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/websocket.js b/lib/websocket.js index 2a2a33b30..f7191a3bd 100644 --- a/lib/websocket.js +++ b/lib/websocket.js @@ -411,12 +411,14 @@ module.exports = WebSocket; * @param {Number} options.handshakeTimeout Timeout in milliseconds for the handshake request * @param {Number} options.protocolVersion Value of the `Sec-WebSocket-Version` header * @param {String} options.origin Value of the `Origin` or `Sec-WebSocket-Origin` header + * @param {Number} options.maxPayload The maximum allowed message size * @private */ function initAsClient (address, protocols, options) { options = Object.assign({ protocolVersion: protocolVersions[1], - perMessageDeflate: true + perMessageDeflate: true, + maxPayload: 100 * 1024 * 1024, }, options, { createConnection: undefined, socketPath: undefined, @@ -599,7 +601,7 @@ function initAsClient (address, protocols, options) { } } - this.setSocket(socket, head, 0); + this.setSocket(socket, head, options.maxPayload); }); } From f2f3c0eaeec5699b5dff964cec770aca4cb09096 Mon Sep 17 00:00:00 2001 From: Ban44n Date: Mon, 18 Jun 2018 11:07:22 +0200 Subject: [PATCH 2/6] Update websocket.js --- lib/websocket.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/websocket.js b/lib/websocket.js index f7191a3bd..6e73761e1 100644 --- a/lib/websocket.js +++ b/lib/websocket.js @@ -418,7 +418,7 @@ function initAsClient (address, protocols, options) { options = Object.assign({ protocolVersion: protocolVersions[1], perMessageDeflate: true, - maxPayload: 100 * 1024 * 1024, + maxPayload: 100 * 1024 * 1024 }, options, { createConnection: undefined, socketPath: undefined, From 2bd9f9eae7e09307bbed5ca712d8cc4e457b630a Mon Sep 17 00:00:00 2001 From: Sten Reijers Date: Mon, 18 Jun 2018 18:08:51 +0200 Subject: [PATCH 3/6] Added maxPayload option for WebSocket clients --- doc/ws.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/ws.md b/doc/ws.md index 47d8abeda..1a19229ff 100644 --- a/doc/ws.md +++ b/doc/ws.md @@ -199,6 +199,7 @@ This class represents a WebSocket. It extends the `EventEmitter`. - `protocolVersion` {Number} Value of the `Sec-WebSocket-Version` header. - `origin` {String} Value of the `Origin` or `Sec-WebSocket-Origin` header depending on the `protocolVersion`. + - `maxPayload` {Number} The maximum allowed message size in bytes. - Any other option allowed in [http.request()][] or [https.request()][]. `perMessageDeflate` default value is `true`. When using an object, parameters From 52a925a5a39dd2935a17bb6ea7f757904ad2080d Mon Sep 17 00:00:00 2001 From: Sten Reijers Date: Mon, 18 Jun 2018 18:09:42 +0200 Subject: [PATCH 4/6] Ensure that maxPayload is enabled for the perMessageDeflate extension in client mode --- lib/websocket.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/websocket.js b/lib/websocket.js index 6e73761e1..539fb1a8d 100644 --- a/lib/websocket.js +++ b/lib/websocket.js @@ -481,7 +481,8 @@ function initAsClient (address, protocols, options) { if (options.perMessageDeflate) { perMessageDeflate = new PerMessageDeflate( options.perMessageDeflate !== true ? options.perMessageDeflate : {}, - false + false, + options.maxPayload ); options.headers['Sec-WebSocket-Extensions'] = extension.format({ [PerMessageDeflate.extensionName]: perMessageDeflate.offer() From 19f6213b65e38cb42a47365516fbf07ddc2901ea Mon Sep 17 00:00:00 2001 From: Sten Reijers Date: Mon, 18 Jun 2018 18:10:05 +0200 Subject: [PATCH 5/6] Tests if Websocket client accepts option.maxPayload --- test/websocket.test.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/test/websocket.test.js b/test/websocket.test.js index 2807e59fb..23aa79ebf 100644 --- a/test/websocket.test.js +++ b/test/websocket.test.js @@ -65,6 +65,28 @@ describe('WebSocket', function () { assert.strictEqual(count, 3); }); + it('accepts the `maxPayload` option', function (done) { + const maxPayload = 20480; + const wss = new WebSocket.Server({ + perMessageDeflate: true, + port: 0 + }, () => { + const ws = new WebSocket(`ws://localhost:${wss.address().port}`, { + perMessageDeflate: true, + maxPayload + }); + + ws.on('open', () => { + assert.strictEqual(ws._receiver._maxPayload, maxPayload); + assert.strictEqual( + ws._receiver._extensions['permessage-deflate']._maxPayload, + maxPayload + ); + wss.close(done); + }); + }); + }); + it('throws an error when using an invalid `protocolVersion`', function () { const options = { agent: new CustomAgent(), protocolVersion: 1000 }; From 56e39b7011cc02b362be38fcf1907def44514ab4 Mon Sep 17 00:00:00 2001 From: Luigi Pinca Date: Sat, 7 Jul 2018 22:37:45 +0200 Subject: [PATCH 6/6] Fix nit --- bench/speed.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bench/speed.js b/bench/speed.js index e5d1591dd..608dc2782 100644 --- a/bench/speed.js +++ b/bench/speed.js @@ -54,7 +54,9 @@ if (cluster.isMaster) { const runConfig = (useBinary, roundtrips, size, cb) => { const data = randomBytes.slice(0, size); - const ws = new WebSocket(`ws://localhost:${port}`); + const ws = new WebSocket(`ws://localhost:${port}`, { + maxPayload: 600 * 1024 * 1024 + }); var roundtrip = 0; var time;