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()) {