Improve JSON-RPC result/error checking, and improve error diagnostic output.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
diff --git a/util.c b/util.c
index 5a55a05..05c876e 100644
--- a/util.c
+++ b/util.c
@@ -83,7 +83,7 @@ static size_t upload_data_cb(void *ptr, size_t size, size_t nmemb,
json_t *json_rpc_call(const char *url, const char *userpass, const char *rpc_req)
{
CURL *curl;
- json_t *val;
+ json_t *val, *err_val, *res_val;
int rc;
struct data_buffer all_data = { };
struct upload_buffer upload_data;
@@ -132,7 +132,7 @@ json_t *json_rpc_call(const char *url, const char *userpass, const char *rpc_req
val = json_loads(all_data.buf, &err);
if (!val) {
- fprintf(stderr, "JSON failed(%d): %s\n", err.line, err.text);
+ fprintf(stderr, "JSON decode failed(%d): %s\n", err.line, err.text);
goto err_out;
}
@@ -142,6 +142,28 @@ json_t *json_rpc_call(const char *url, const char *userpass, const char *rpc_req
free(s);
}
+ /* JSON-RPC valid response returns a non-null 'result',
+ * and a null 'error'.
+ */
+ res_val = json_object_get(val, "result");
+ err_val = json_object_get(val, "error");
+
+ if (!res_val || json_is_null(res_val) ||
+ (err_val && !json_is_null(err_val))) {
+ char *s;
+
+ if (err_val)
+ s = json_dumps(err_val, JSON_INDENT(3));
+ else
+ s = strdup("(unknown reason)");
+
+ fprintf(stderr, "JSON-RPC call failed: %s\n", s);
+
+ free(s);
+
+ goto err_out;
+ }
+
databuf_free(&all_data);
curl_slist_free_all(headers);
curl_easy_cleanup(curl);