diff --git a/daemon/jsonrpc.c b/daemon/jsonrpc.c index 946b7d78e..b0c119ddb 100644 --- a/daemon/jsonrpc.c +++ b/daemon/jsonrpc.c @@ -353,12 +353,18 @@ static void json_result(struct json_connection *jcon, const char *id, const char *res, const char *err) { struct json_output *out = tal(jcon, struct json_output); - - out->json = tal_fmt(out, - "{ \"result\" : %s," - " \"error\" : %s," - " \"id\" : %s }\n", - res, err, id); + if (err == NULL) + out->json = tal_fmt(out, + "{ \"jsonrpc\": \"2.0\", " + "\"result\" : %s," + " \"id\" : %s }\n", + res, id); + else + out->json = tal_fmt(out, + "{ \"jsonrpc\": \"2.0\", " + " \"error\" : %s," + " \"id\" : %s }\n", + err, id); /* Queue for writing, and wake writer (and maybe reader). */ list_add_tail(&jcon->output, &out->list); @@ -386,7 +392,7 @@ void command_success(struct command *cmd, struct json_result *result) return; } assert(jcon->current == cmd); - json_result(jcon, cmd->id, json_result_string(result), "null"); + json_result(jcon, cmd->id, json_result_string(result), NULL); log_debug(jcon->log, "Success"); jcon->current = tal_free(cmd); } @@ -418,7 +424,7 @@ void command_fail(struct command *cmd, const char *fmt, ...) quote = tal_fmt(cmd, "\"%s\"", error); assert(jcon->current == cmd); - json_result(jcon, cmd->id, "null", quote); + json_result(jcon, cmd->id, NULL, quote); jcon->current = tal_free(cmd); } @@ -426,7 +432,7 @@ static void json_command_malformed(struct json_connection *jcon, const char *id, const char *error) { - return json_result(jcon, id, "null", error); + return json_result(jcon, id, NULL, error); } static void parse_request(struct json_connection *jcon, const jsmntok_t tok[]) diff --git a/daemon/lightning-cli.c b/daemon/lightning-cli.c index 49dd43325..8e482b7f4 100644 --- a/daemon/lightning-cli.c +++ b/daemon/lightning-cli.c @@ -128,7 +128,7 @@ int main(int argc, char *argv[]) tal_resize(&resp, tal_count(resp) * 2); /* parsing huge outputs is slow: do quick check first. */ - if (num_opens == num_closes && strstr(resp, "\"result\"")) + if (num_opens == num_closes) break; } if (i < 0) @@ -158,13 +158,10 @@ int main(int argc, char *argv[]) "Non-object response '%s'", resp); result = json_get_member(resp, toks, "result"); - if (!result) - errx(ERROR_TALKING_TO_LIGHTNINGD, - "Missing 'result' in response '%s'", resp); error = json_get_member(resp, toks, "error"); - if (!error) + if (!error && !result) errx(ERROR_TALKING_TO_LIGHTNINGD, - "Missing 'error' in response '%s'", resp); + "Either 'result' or 'error' must be returned in response '%s'", resp); id = json_get_member(resp, toks, "id"); if (!id) errx(ERROR_TALKING_TO_LIGHTNINGD, @@ -174,7 +171,7 @@ int main(int argc, char *argv[]) "Incorrect 'id' in response: %.*s", json_tok_len(id), json_tok_contents(resp, id)); - if (json_tok_is_null(resp, error)) { + if (!error || json_tok_is_null(resp, error)) { printf("%.*s\n", json_tok_len(result), json_tok_contents(resp, result));