THRIFT-2281 Generated send/recv code ignores errors returned by the underlying protocol
Patch: Jens Geyer
diff --git a/compiler/cpp/src/generate/t_go_generator.cc b/compiler/cpp/src/generate/t_go_generator.cc
index 36a9c67..28a2d4c 100644
--- a/compiler/cpp/src/generate/t_go_generator.cc
+++ b/compiler/cpp/src/generate/t_go_generator.cc
@@ -1667,7 +1667,13 @@
indent() << " p.OutputProtocol = oprot" << endl <<
indent() << "}" << endl <<
indent() << "p.SeqId++" << endl <<
- indent() << "oprot.WriteMessageBegin(\"" << (*f_iter)->get_name() << "\", thrift.CALL, p.SeqId)" << endl <<
+ indent() << "if err = oprot.WriteMessageBegin(\"" << (*f_iter)->get_name() << "\", thrift.CALL, p.SeqId); err != nil {" << endl;
+ indent_up();
+ f_service_ <<
+ indent() << "return" << endl;
+ indent_down();
+ f_service_ <<
+ indent() << "}" << endl <<
indent() << args << " := New" << publicize(argsname) << "()" << endl;
for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
@@ -1677,12 +1683,23 @@
// Write to the stream
f_service_ <<
- indent() << "err = " << args << ".Write(oprot)" << endl <<
- indent() << "oprot.WriteMessageEnd()" << endl <<
- indent() << "oprot.Flush()" << endl <<
+ indent() << "if err = " << args << ".Write(oprot); err != nil {" << endl;
+ indent_up();
+ f_service_ <<
indent() << "return" << endl;
indent_down();
f_service_ <<
+ indent() << "}" << endl <<
+ indent() << "if err = oprot.WriteMessageEnd(); err != nil {" << endl;
+ indent_up();
+ f_service_ <<
+ indent() << "return" << endl;
+ indent_down();
+ f_service_ <<
+ indent() << "}" << endl <<
+ indent() << "return oprot.Flush()" << endl;
+ indent_down();
+ f_service_ <<
indent() << "}" << endl << endl;
if (true) { //!(*f_iter)->is_oneway() || true) {}
@@ -1739,8 +1756,12 @@
indent() << " return" << endl <<
indent() << "}" << endl <<
indent() << result << " := New" << publicize(resultname) << "()" << endl <<
- indent() << "err = " << result << ".Read(iprot)" << endl <<
- indent() << "iprot.ReadMessageEnd()" << endl;
+ indent() << "if err = " << result << ".Read(iprot); err != nil {" << endl <<
+ indent() << " return" << endl <<
+ indent() << "}" << endl <<
+ indent() << "if err = iprot.ReadMessageEnd(); err != nil {" << endl <<
+ indent() << " return" << endl <<
+ indent() << "}" << endl;
// Careful, only return _result if not a void function
if (!(*f_iter)->get_returntype()->is_void()) {