From ca7223d90ae6b2e9107f7902f9bc2fb78076679b Mon Sep 17 00:00:00 2001 From: xing Date: Thu, 24 Aug 2017 13:50:50 +0800 Subject: [PATCH 1/2] fix hessian service readString bug --- lib/reader2.js | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/lib/reader2.js b/lib/reader2.js index 6c22e07..510f869 100644 --- a/lib/reader2.js +++ b/lib/reader2.js @@ -229,6 +229,34 @@ Reader.prototype.readClassDef = function(data) { } }; +Reader.prototype.parseUTF8Char = function(data) { + if (data) + this.reader = new BufferReader(data); + + var ch = this.reader.nextUInt8(); + this.reader.move(-1); + + if (ch < 0x80) { + return this.reader.nextString(1); + } else if ((ch & 0xe0) == 0xc0) { + return this.reader.nextString(2); + } + else if ((ch & 0xf0) == 0xe0) { + return this.reader.nextString(3); + } + else + throw new Error("bad utf-8 encoding at " + ch); +} + +Reader.prototype.parseUTF8String = function(length) { + var len = length; + var str = ''; + while (len) { + str += this.parseUTF8Char(); + len -= 1; + } + return str; +} Reader.prototype.readString = function(data) { if (data) @@ -236,17 +264,16 @@ Reader.prototype.readString = function(data) { var code = this.reader.nextUInt8(); if (code >= 0 && code < 32) { - return this.reader.nextString(code); + return this.parseUTF8String(code); } else if (code >= 0x30 && code <= 0x33) { - this.reader.move(-1); - var len = this.reader.nextUInt16BE() - 0x3000; - return this.reader.nextString(len); + var len = (code - 0x30) * 256 + this.reader.nextUInt8(); + return this.parseUTF8String(len); } else if (code === 0x53) { var len = this.reader.nextUInt16BE(); - return this.reader.nextString(len); + return this.parseUTF8String(len); } else if (code === 0x52) { var len = this.reader.nextUInt16BE(); - return this.reader.nextString(len) + this.readString(); + return this.parseUTF8String(len) + this.readString(); } }; From 6ae379a4ba78820c1f73d84b2c3c76a767d0dc86 Mon Sep 17 00:00:00 2001 From: xing Date: Thu, 24 Aug 2017 15:28:39 +0800 Subject: [PATCH 2/2] fix test --- test/test2.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/test2.js b/test/test2.js index c0da97b..d0b7715 100644 --- a/test/test2.js +++ b/test/test2.js @@ -89,9 +89,11 @@ describe('hessian 2.0 test', function() { MAKE_REPLYTEST('replyUntypedMap_' + i, null, function(res) { if (i < 3) { - assert.lengthOf(res.keys(), i); + if (res.keys().length) assert.lengthOf(res.keys(), i); + else assert.equal(res.size, i); } else { - assert.lengthOf(res.keys(), 1); + if (res.keys().length) assert.lengthOf(res.keys(), 1); + else assert.equal(res.size, 1); } }); });