Skip to content

Commit 5edb460

Browse files
committed
[fix] Use a random masking key also for zero-length frames
1 parent 8127ebc commit 5edb460

File tree

4 files changed

+10
-72
lines changed

4 files changed

+10
-72
lines changed

lib/Sender.js

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class Sender {
9090
ping (data, mask) {
9191
var readOnly = true;
9292

93-
if (data && !Buffer.isBuffer(data)) {
93+
if (!Buffer.isBuffer(data)) {
9494
if (data instanceof ArrayBuffer) {
9595
data = Buffer.from(data);
9696
} else if (ArrayBuffer.isView(data)) {
@@ -136,7 +136,7 @@ class Sender {
136136
pong (data, mask) {
137137
var readOnly = true;
138138

139-
if (data && !Buffer.isBuffer(data)) {
139+
if (!Buffer.isBuffer(data)) {
140140
if (data instanceof ArrayBuffer) {
141141
data = Buffer.from(data);
142142
} else if (ArrayBuffer.isView(data)) {
@@ -189,7 +189,7 @@ class Sender {
189189
var rsv1 = options.compress;
190190
var readOnly = true;
191191

192-
if (data && !Buffer.isBuffer(data)) {
192+
if (!Buffer.isBuffer(data)) {
193193
if (data instanceof ArrayBuffer) {
194194
data = Buffer.from(data);
195195
} else if (ArrayBuffer.isView(data)) {
@@ -202,7 +202,7 @@ class Sender {
202202

203203
if (this.firstFragment) {
204204
this.firstFragment = false;
205-
if (rsv1 && data && this.perMessageDeflate) {
205+
if (rsv1 && this.perMessageDeflate) {
206206
rsv1 = data.length >= this.perMessageDeflate.threshold;
207207
}
208208
this.compress = rsv1;
@@ -288,19 +288,6 @@ class Sender {
288288
* @private
289289
*/
290290
frameAndSend (data, options, cb) {
291-
if (!data) {
292-
const bytes = [options.opcode, 0];
293-
294-
if (options.fin) bytes[0] |= 0x80;
295-
if (options.mask) {
296-
bytes[1] |= 0x80;
297-
bytes.push(0, 0, 0, 0);
298-
}
299-
300-
sendFramedData(this, Buffer.from(bytes), null, cb);
301-
return;
302-
}
303-
304291
const mergeBuffers = data.length < 1024 || options.mask && options.readOnly;
305292
var dataOffset = options.mask ? 6 : 2;
306293
var payloadLength = data.length;

lib/WebSocket.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ class WebSocket extends EventEmitter {
310310

311311
if (typeof data === 'number') data = data.toString();
312312
if (mask === undefined) mask = !this._isServer;
313-
this._sender.ping(data, mask);
313+
this._sender.ping(data || constants.EMPTY_BUFFER, mask);
314314
}
315315

316316
/**
@@ -329,7 +329,7 @@ class WebSocket extends EventEmitter {
329329

330330
if (typeof data === 'number') data = data.toString();
331331
if (mask === undefined) mask = !this._isServer;
332-
this._sender.pong(data, mask);
332+
this._sender.pong(data || constants.EMPTY_BUFFER, mask);
333333
}
334334

335335
/**
@@ -357,20 +357,19 @@ class WebSocket extends EventEmitter {
357357
}
358358

359359
if (typeof data === 'number') data = data.toString();
360-
else if (!data) data = '';
361360

362361
const opts = Object.assign({
363-
fin: true,
364362
binary: typeof data !== 'string',
365363
mask: !this._isServer,
366-
compress: true
364+
compress: true,
365+
fin: true
367366
}, options);
368367

369368
if (!this.extensions[PerMessageDeflate.extensionName]) {
370369
opts.compress = false;
371370
}
372371

373-
this._sender.send(data, opts, cb);
372+
this._sender.send(data || constants.EMPTY_BUFFER, opts, cb);
374373
}
375374

376375
/**

test/Sender.test.js

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -178,30 +178,6 @@ describe('Sender', function () {
178178
sender.send('123', { compress: true, fin: true });
179179
});
180180

181-
it('compresses null as first fragment', function (done) {
182-
const fragments = [];
183-
const perMessageDeflate = new PerMessageDeflate({ threshold: 0 });
184-
const sender = new Sender({
185-
write: (data) => {
186-
fragments.push(data);
187-
if (fragments.length !== 2) return;
188-
189-
assert.strictEqual(fragments[0][0] & 0x40, 0x40);
190-
assert.strictEqual(fragments[0].length, 3);
191-
assert.strictEqual(fragments[1][0] & 0x40, 0x00);
192-
assert.strictEqual(fragments[1].length, 8);
193-
done();
194-
}
195-
}, {
196-
'permessage-deflate': perMessageDeflate
197-
});
198-
199-
perMessageDeflate.accept([{}]);
200-
201-
sender.send(null, { compress: true, fin: false });
202-
sender.send('data', { compress: true, fin: true });
203-
});
204-
205181
it('compresses empty buffer as first fragment', function (done) {
206182
const fragments = [];
207183
const perMessageDeflate = new PerMessageDeflate({ threshold: 0 });
@@ -226,30 +202,6 @@ describe('Sender', function () {
226202
sender.send('data', { compress: true, fin: true });
227203
});
228204

229-
it('compresses null last fragment', function (done) {
230-
const fragments = [];
231-
const perMessageDeflate = new PerMessageDeflate({ threshold: 0 });
232-
const sender = new Sender({
233-
write: (data) => {
234-
fragments.push(data);
235-
if (fragments.length !== 2) return;
236-
237-
assert.strictEqual(fragments[0][0] & 0x40, 0x40);
238-
assert.strictEqual(fragments[0].length, 12);
239-
assert.strictEqual(fragments[1][0] & 0x40, 0x00);
240-
assert.strictEqual(fragments[1].length, 3);
241-
done();
242-
}
243-
}, {
244-
'permessage-deflate': perMessageDeflate
245-
});
246-
247-
perMessageDeflate.accept([{}]);
248-
249-
sender.send('data', { compress: true, fin: false });
250-
sender.send(null, { compress: true, fin: true });
251-
});
252-
253205
it('compresses empty buffer as last fragment', function (done) {
254206
const fragments = [];
255207
const perMessageDeflate = new PerMessageDeflate({ threshold: 0 });

test/WebSocket.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -811,7 +811,7 @@ describe('WebSocket', function () {
811811
ws.on('open', () => ws.send());
812812

813813
srv.on('message', (message, flags) => {
814-
assert.strictEqual(message, '');
814+
assert.ok(message.equals(Buffer.alloc(0)));
815815
srv.close(done);
816816
ws.terminate();
817817
});

0 commit comments

Comments
 (0)