Skip to content

Commit a2f4e7c

Browse files
LeSingh1lpinca
authored andcommitted
[fix] Count empty fragments toward the limit (#2329)
Ensure that empty fragments are counted against the `maxFragments` limit.
1 parent e79f912 commit a2f4e7c

2 files changed

Lines changed: 33 additions & 34 deletions

File tree

lib/receiver.js

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class Receiver extends Writable {
7777

7878
this._totalPayloadLength = 0;
7979
this._messageLength = 0;
80+
this._numFragments = 0;
8081
this._fragments = [];
8182

8283
this._errored = false;
@@ -500,29 +501,26 @@ class Receiver extends Writable {
500501
return;
501502
}
502503

504+
if (this._maxFragments > 0 && ++this._numFragments > this._maxFragments) {
505+
const error = this.createError(
506+
RangeError,
507+
'Too many message fragments',
508+
false,
509+
1008,
510+
'WS_ERR_TOO_MANY_BUFFERED_PARTS'
511+
);
512+
513+
cb(error);
514+
return;
515+
}
516+
503517
if (this._compressed) {
504518
this._state = INFLATING;
505519
this.decompress(data, cb);
506520
return;
507521
}
508522

509523
if (data.length) {
510-
if (
511-
this._maxFragments > 0 &&
512-
this._fragments.length >= this._maxFragments
513-
) {
514-
const error = this.createError(
515-
RangeError,
516-
'Too many message fragments',
517-
false,
518-
1008,
519-
'WS_ERR_TOO_MANY_BUFFERED_PARTS'
520-
);
521-
522-
cb(error);
523-
return;
524-
}
525-
526524
//
527525
// This message is not compressed so its length is the sum of the payload
528526
// length of all fragments.
@@ -562,22 +560,6 @@ class Receiver extends Writable {
562560
return;
563561
}
564562

565-
if (
566-
this._maxFragments > 0 &&
567-
this._fragments.length >= this._maxFragments
568-
) {
569-
const error = this.createError(
570-
RangeError,
571-
'Too many message fragments',
572-
false,
573-
1008,
574-
'WS_ERR_TOO_MANY_BUFFERED_PARTS'
575-
);
576-
577-
cb(error);
578-
return;
579-
}
580-
581563
this._fragments.push(buf);
582564
}
583565

@@ -604,6 +586,7 @@ class Receiver extends Writable {
604586
this._totalPayloadLength = 0;
605587
this._messageLength = 0;
606588
this._fragmented = 0;
589+
this._numFragments = 0;
607590
this._fragments = [];
608591

609592
if (this._opcode === 2) {

test/receiver.test.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -988,7 +988,7 @@ describe('Receiver', () => {
988988
});
989989
});
990990

991-
it('emits an error if there are too many message fragments (1/2)', (done) => {
991+
it('emits an error if there are too many message fragments (1/3)', (done) => {
992992
const receiver = new Receiver({ maxFragments: 2 });
993993

994994
receiver.on('error', (err) => {
@@ -1014,7 +1014,23 @@ describe('Receiver', () => {
10141014
);
10151015
});
10161016

1017-
it('emits an error if there are too many message fragments (2/2)', (done) => {
1017+
it('emits an error if there are too many message fragments (2/3)', (done) => {
1018+
const receiver = new Receiver({ maxFragments: 2 });
1019+
1020+
receiver.on('error', (err) => {
1021+
assert.ok(err instanceof RangeError);
1022+
assert.strictEqual(err.code, 'WS_ERR_TOO_MANY_BUFFERED_PARTS');
1023+
assert.strictEqual(err.message, 'Too many message fragments');
1024+
assert.strictEqual(err[kStatusCode], 1008);
1025+
done();
1026+
});
1027+
1028+
receiver.write(Buffer.from([0x02, 0x00]));
1029+
receiver.write(Buffer.from([0x00, 0x00]));
1030+
receiver.write(Buffer.from([0x00, 0x00]));
1031+
});
1032+
1033+
it('emits an error if there are too many message fragments (3/3)', (done) => {
10181034
const perMessageDeflate = new PerMessageDeflate();
10191035
perMessageDeflate.accept([{}]);
10201036

0 commit comments

Comments
 (0)