THRIFT-2994 Node.js TJSONProtocol cannot be used for object serialization Client: Node.js Patch: Tim Sebastian
This closes #379 Project: http://git-wip-us.apache.org/repos/asf/thrift/repo Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/fe3f3361 Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/fe3f3361 Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/fe3f3361 Branch: refs/heads/master Commit: fe3f33619ed268c1dcbea2523bed4b5f935d404b Parents: 378b727 Author: Tim Sebastian <[email protected]> Authored: Tue Oct 6 11:03:07 2015 +0200 Committer: Nobuaki Sukegawa <[email protected]> Committed: Wed Jan 6 04:35:12 2016 +0900 ---------------------------------------------------------------------- lib/nodejs/lib/thrift/json_protocol.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/thrift/blob/fe3f3361/lib/nodejs/lib/thrift/json_protocol.js ---------------------------------------------------------------------- diff --git a/lib/nodejs/lib/thrift/json_protocol.js b/lib/nodejs/lib/thrift/json_protocol.js index b98f131..2e0d29a 100644 --- a/lib/nodejs/lib/thrift/json_protocol.js +++ b/lib/nodejs/lib/thrift/json_protocol.js @@ -92,9 +92,16 @@ TJSONProtocol.RType.set = Type.SET; TJSONProtocol.Version = 1; TJSONProtocol.prototype.flush = function() { + this.writeToTransportIfStackIsFlushable(); return this.trans.flush(); }; +TJSONProtocol.prototype.writeToTransportIfStackIsFlushable = function() { + if (this.tstack.length === 1) { + this.trans.write(this.tstack.pop()); + } +}; + /** * Serializes the beginning of a Thrift RPC message. * @param {string} name - The service method to call. @@ -102,9 +109,6 @@ TJSONProtocol.prototype.flush = function() { * @param {number} seqid - The sequence number of this call (always 0 in Apache Thrift). */ TJSONProtocol.prototype.writeMessageBegin = function(name, messageType, seqid) { - this.tstack = []; - this.tpos = []; - this.tstack.push([TJSONProtocol.Version, '"' + name + '"', messageType, seqid]); }; @@ -119,6 +123,7 @@ TJSONProtocol.prototype.writeMessageEnd = function() { this.wbuf = '[' + this.wobj.join(',') + ']'; + // we assume there is nothing more to come so we write this.trans.write(this.wbuf); }; @@ -151,6 +156,8 @@ TJSONProtocol.prototype.writeStructEnd = function() { str += '}'; this.tstack[p] = str; + + this.writeToTransportIfStackIsFlushable(); }; /** @@ -181,6 +188,8 @@ TJSONProtocol.prototype.writeFieldEnd = function() { fieldInfo.fieldType + ':' + value + '}'; } this.tpos.pop(); + + this.writeToTransportIfStackIsFlushable(); }; /** @@ -237,6 +246,8 @@ TJSONProtocol.prototype.writeMapEnd = function() { this.tstack[p].push(map); this.tstack[p] = '[' + this.tstack[p].join(',') + ']'; + + this.writeToTransportIfStackIsFlushable(); }; /** @@ -262,6 +273,8 @@ TJSONProtocol.prototype.writeListEnd = function() { } this.tstack[p] = '[' + this.tstack[p].join(',') + ']'; + + this.writeToTransportIfStackIsFlushable(); }; /** @@ -287,6 +300,8 @@ TJSONProtocol.prototype.writeSetEnd = function() { } this.tstack[p] = '[' + this.tstack[p].join(',') + ']'; + + this.writeToTransportIfStackIsFlushable(); }; /** Serializes a boolean */
