From 9e5a173c3845fb7b5d316b0455352a08847b8c23 Mon Sep 17 00:00:00 2001 From: Jeff Garzik Date: Tue, 28 Dec 2010 15:22:53 -0500 Subject: [PATCH] Improve JSON-RPC result/error checking, and improve error diagnostic output. --- util.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/util.c b/util.c index 5a55a05c..05c876e4 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);