changeset 176:60dc013bd69c

Fix handling of parsing json error responses from a server, and allow for re-writing them without changing the error message further.
author Lucas Thompson <dev@lucas.im>
date Tue, 31 Jan 2017 22:56:52 +0000
parents 7532233f8e49
children 1990dd9570d8
files vamp-json/VampJson.h vamp-server/convert.cpp
diffstat 2 files changed, 15 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/vamp-json/VampJson.h	Tue Jan 31 22:54:08 2017 +0000
+++ b/vamp-json/VampJson.h	Tue Jan 31 22:56:52 2017 +0000
@@ -1298,7 +1298,8 @@
     static json11::Json
     fromError(std::string errorText,
               RRType responseType,
-              const json11::Json &id) {
+              const json11::Json &id,
+              bool writeVerbatimError = false) {
 
         json11::Json::object jo;
         markRPC(jo);
@@ -1315,7 +1316,7 @@
         json11::Json::object eo;
         eo["code"] = 0;
 
-        if (responseType == RRType::NotValid) {
+        if (responseType == RRType::NotValid || writeVerbatimError) {
             eo["message"] = errorText;
         } else {
             eo["message"] = 
--- a/vamp-server/convert.cpp	Tue Jan 31 22:54:08 2017 +0000
+++ b/vamp-server/convert.cpp	Tue Jan 31 22:56:52 2017 +0000
@@ -337,11 +337,11 @@
     Json id = writeJsonId(rr.id);
 
     if (!rr.success) {
-
-        j = VampJson::fromError(rr.errorText, rr.type, id);
+         // errorText here likely contains a full message produced by simple-server
+         // setting writeVerbatimError to true avoids doubling error descriptions 
+        j = VampJson::fromError(rr.errorText, rr.type, id, true);
 
     } else {
-    
         switch (rr.type) {
 
         case RRType::List:
@@ -558,8 +558,15 @@
     if (format == "json") {
         string err;
         auto result = readInputJson(direction, err, eof);
-        if (err != "") throw runtime_error(err);
-        else return result;
+        const bool isRecognisedError = !result.success && result.errorText != "";
+        
+        // if the RequestOrResponse (result) has been populated with success=false and an error message
+        // then the server returned a well formed error, it is safe to return it for conversion 
+        // -- but if err is populated, something else has gone wrong
+        if (isRecognisedError || err == "") 
+            return result;
+        else 
+            throw runtime_error(err);
     } else if (format == "capnp") {
         return readInputCapnp(direction, eof);
     } else {
@@ -661,7 +668,6 @@
             writeOutput(outformat, rr);
 
         } catch (std::exception &e) {
-
             cerr << "Error: " << e.what() << endl;
             exit(1);
         }