diff --git a/lib/parser.js b/lib/parser.js index 43f8f79b..b461bdc7 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -5,6 +5,17 @@ var Parser = function(buffer) { var p = Parser.prototype; p.setBuffer = function(buffer) { + if(this.lastBuffer) { //we have unfinished biznaz + //need to combine last two buffers + var remaining = this.lastBuffer.length - this.lastOffset; + var combinedBuffer = new Buffer(buffer.length + remaining); + this.lastBuffer.copy(combinedBuffer, 0, this.lastOffset); + this.lastBuffer = false; + buffer.copy(combinedBuffer, remaining, 0); + this.buffer = combinedBuffer; + this.offset = 0; + return; + } this.buffer = buffer; this.offset = 0; }; @@ -14,7 +25,15 @@ p.parseMessage = function() { //clean packet - nothing left for next buffer return false; } + var remaining = this.buffer.length - this.offset - 1; var messageID = this.buffer[this.offset]; + var length = this.peekInt32(this.offset + 1); + if(remaining < 5 || remaining < length) { + this.lastBuffer = this.buffer; + this.lastOffset = this.offset; + return false; + } + return this["parse"+messageID](); }; @@ -146,8 +165,8 @@ p.parseInt32 = function() { return value; }; -p.peekInt32 = function() { - var offset = this.offset; +p.peekInt32 = function(offset) { + offset = offset || this.offset; var buffer = this.buffer; return ((buffer[offset++] << 24) + (buffer[offset++] << 16) + diff --git a/test/unit/parser-tests.js b/test/unit/parser-tests.js index 02815085..dedde752 100644 --- a/test/unit/parser-tests.js +++ b/test/unit/parser-tests.js @@ -310,6 +310,7 @@ test('split buffer message parsing', function() { client.on('message', function(msg) { message = msg; }); + test('parses when full buffer comes in', function() { stream.emit('data', fullBuffer); assert.length(message.fields, 5); @@ -320,8 +321,7 @@ test('split buffer message parsing', function() { assert.equal(message.fields[4], "!"); }); - test('parses when split in the middle', function() { - var split = 6; + var testMessageRecievedAfterSpiltAt = function(split) { var firstBuffer = new Buffer(fullBuffer.length-split); var secondBuffer = new Buffer(fullBuffer.length-firstBuffer.length); fullBuffer.copy(firstBuffer, 0, 0); @@ -334,5 +334,16 @@ test('split buffer message parsing', function() { assert.equal(message.fields[2], "zug zug"); assert.equal(message.fields[3], null); assert.equal(message.fields[4], "!"); + + }; + + test('parses when split in the middle', function() { + testMessageRecievedAfterSpiltAt(6); }); + + test('parses when split at beginning', function() { + testMessageRecievedAfterSpiltAt(2); + }); + + });