diff options
author | Jeff Garzik <jeff@garzik.org> | 2010-12-28 15:22:53 -0500 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2010-12-28 15:22:53 -0500 |
commit | 9e5a173c3845fb7b5d316b0455352a08847b8c23 (patch) | |
tree | 86afb08ab77bc0dc4e34d0f1f2d2d93a888f7c1b /util.c | |
parent | 872211caada9a42a5de31d3dacf3eab7eba5e34a (diff) |
Improve JSON-RPC result/error checking, and improve error diagnostic output.
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 26 |
1 files changed, 24 insertions, 2 deletions
@@ -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); |