From b49703e279cd087bea508bbcc545f11e1ebc45c2 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Sat, 16 Jul 2022 22:48:27 +0930 Subject: [PATCH] commando: correctly reflect error data field. Some JSON error include "data", and we should reflect that. Signed-off-by: Rusty Russell --- plugins/commando.c | 20 +++++++++++++++----- tests/test_plugin.py | 12 ++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/plugins/commando.c b/plugins/commando.c index 3103c4d86..4eed51d56 100644 --- a/plugins/commando.c +++ b/plugins/commando.c @@ -1,5 +1,6 @@ #include "config.h" #include +#include #include #include #include @@ -331,8 +332,10 @@ static struct command_result *handle_reply(struct node_id *peer, err = json_get_member(replystr, toks, "error"); if (err) { const jsmntok_t *code = json_get_member(replystr, err, "code"); - int ecode; const jsmntok_t *message = json_get_member(replystr, err, "message"); + const jsmntok_t *datatok = json_get_member(replystr, err, "data"); + struct json_out *data; + int ecode; if (!code || !json_to_int(replystr, code, &ecode)) { return command_fail(ocmd->cmd, COMMANDO_ERROR_LOCAL, "Error '%.*s' had no valid code", @@ -343,10 +346,17 @@ static struct command_result *handle_reply(struct node_id *peer, return command_fail(ocmd->cmd, COMMANDO_ERROR_LOCAL, "Error had no message"); } - /* FIXME: data! */ - return command_fail(ocmd->cmd, ecode, "%.*s", - message->end - message->start, - replystr + message->start); + if (datatok) { + data = json_out_new(ocmd->cmd); + memcpy(json_out_direct(data, json_tok_full_len(datatok)), + json_tok_full(replystr, datatok), + json_tok_full_len(datatok)); + } else + data = NULL; + + return command_done_err(ocmd->cmd, ecode, + json_strdup(tmpctx, replystr, message), + data); } result = json_get_member(replystr, toks, "result"); diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 77683b24e..f0e656e04 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -2598,3 +2598,15 @@ def test_commando(node_factory): 'deschashonly': True}}) assert 'bolt11' in ret + + # This will fail, will include data. + with pytest.raises(RpcError, match='No connection to first peer found') as exc_info: + l2.rpc.call(method='commando', + payload={'peer_id': l1.info['id'], + 'method': 'sendpay', + 'params': {'route': [{'amount_msat': 1000, + 'id': l1.info['id'], + 'delay': 12, + 'channel': '1x2x3'}], + 'payment_hash': '00' * 32}}) + assert exc_info.value.error['data']['erring_index'] == 0