got spliced packet tests passing

This commit is contained in:
brianc 2010-10-13 23:29:20 -05:00
parent e4d6b91668
commit 851e928d38
2 changed files with 34 additions and 4 deletions

View File

@ -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) +

View File

@ -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);
});
});