This is an automated email from the ASF dual-hosted git repository.

jking pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/thrift.git


The following commit(s) were added to refs/heads/master by this push:
     new 896c206  THRIFT-4564: Reset buffered transport on serizliation errors
896c206 is described below

commit 896c206c569f80c181c4c47a94b3d217df88b5a0
Author: Brian Forbis <[email protected]>
AuthorDate: Sun May 27 13:37:06 2018 -0400

    THRIFT-4564: Reset buffered transport on serizliation errors
---
 compiler/cpp/src/thrift/generate/t_js_generator.cc | 44 +++++++++++++++++-----
 lib/nodejs/lib/thrift/buffered_transport.js        |  8 ++++
 2 files changed, 42 insertions(+), 10 deletions(-)

diff --git a/compiler/cpp/src/thrift/generate/t_js_generator.cc 
b/compiler/cpp/src/thrift/generate/t_js_generator.cc
index 6f73c1c..512fe3c 100644
--- a/compiler/cpp/src/thrift/generate/t_js_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_js_generator.cc
@@ -1529,16 +1529,7 @@ void t_js_generator::generate_service_client(t_service* 
tservice) {
 
     std::string messageType = (*f_iter)->is_oneway() ? 
"Thrift.MessageType.ONEWAY"
                                                      : 
"Thrift.MessageType.CALL";
-
-    // Serialize the request header
-    if (gen_node_) {
-      f_service_ << indent() << outputVar << ".writeMessageBegin('" << 
(*f_iter)->get_name()
-                 << "', " << messageType << ", this.seqid());" << endl;
-    } else {
-      f_service_ << indent() << outputVar << ".writeMessageBegin('" << 
(*f_iter)->get_name()
-                 << "', " << messageType << ", this.seqid);" << endl;
-    }
-
+    // Build args
     if (fields.size() > 0){
       f_service_ << indent() << "var params = {" << endl;
       for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
@@ -1555,6 +1546,20 @@ void t_js_generator::generate_service_client(t_service* 
tservice) {
       f_service_ << indent() << "var args = new " << argsname << "();" << endl;
     }
 
+
+    // Serialize the request header within try/catch
+    f_service_ << indent() << "try {" << endl;
+    indent_up();
+
+    if (gen_node_) {
+      f_service_ << indent() << outputVar << ".writeMessageBegin('" << 
(*f_iter)->get_name()
+                 << "', " << messageType << ", this.seqid());" << endl;
+    } else {
+      f_service_ << indent() << outputVar << ".writeMessageBegin('" << 
(*f_iter)->get_name()
+                 << "', " << messageType << ", this.seqid);" << endl;
+    }
+
+
     // Write to the stream
     f_service_ << indent() << "args.write(" << outputVar << ");" << endl << 
indent() << outputVar
                << ".writeMessageEnd();" << endl;
@@ -1606,6 +1611,25 @@ void t_js_generator::generate_service_client(t_service* 
tservice) {
     }
 
     indent_down();
+    f_service_ << indent() << "}" << endl;
+
+    // Reset the transport if there was a serialization error
+    f_service_ << indent() << "catch (e) {" << endl;
+    indent_up();
+    if (gen_node_) {
+      f_service_ << indent() << "if (typeof " << outputVar << ".reset === 
'function') {" << endl;
+      f_service_ << indent() << "  " << outputVar << ".reset();" << endl;
+      f_service_ << indent() << "}" << endl;
+    } else {
+      f_service_ << indent() << "if (typeof " << outputVar << 
".getTransport().reset === 'function') {" << endl;
+      f_service_ << indent() << "  " << outputVar << 
".getTransport().reset();" << endl;
+      f_service_ << indent() << "}" << endl;
+    }
+    f_service_ << indent() << "throw e;" << endl;
+    indent_down();
+    f_service_ << indent() << "}" << endl;
+
+    indent_down();
 
     f_service_ << "};" << endl;
 
diff --git a/lib/nodejs/lib/thrift/buffered_transport.js 
b/lib/nodejs/lib/thrift/buffered_transport.js
index 13636b5..a9e006e 100644
--- a/lib/nodejs/lib/thrift/buffered_transport.js
+++ b/lib/nodejs/lib/thrift/buffered_transport.js
@@ -33,6 +33,14 @@ function TBufferedTransport(buffer, callback) {
   this.onFlush = callback;
 };
 
+TBufferedTransport.prototype.reset = function() {
+  this.inBuf = new Buffer(this.defaultReadBufferSize);
+  this.readCursor = 0;
+  this.writeCursor = 0;
+  this.outBuffers = [];
+  this.outCount = 0;
+}
+
 TBufferedTransport.receiver = function(callback, seqid) {
   var reader = new TBufferedTransport();
 

Reply via email to