From 48ca390f79de87689b2ce63c830bf19377907583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Sun, 10 Mar 2024 14:22:56 +0100 Subject: [PATCH] relay/api: add support of buffer id in POST /api/input (issue #2081) --- src/plugins/relay/api/relay-api-protocol.c | 49 ++++++++++++++----- .../relay/api/test-relay-api-protocol.cpp | 19 ++++++- 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/src/plugins/relay/api/relay-api-protocol.c b/src/plugins/relay/api/relay-api-protocol.c index 7bab96505..70f3cc9c3 100644 --- a/src/plugins/relay/api/relay-api-protocol.c +++ b/src/plugins/relay/api/relay-api-protocol.c @@ -475,13 +475,14 @@ error: * Callback for resource "input". * * Routes: - * POST /api/input/{buffer_name} + * POST /api/input */ RELAY_API_PROTOCOL_CALLBACK(input) { - cJSON *json_body, *json_buffer, *json_command; + cJSON *json_body, *json_buffer_id, *json_buffer_name, *json_command; const char *ptr_buffer_name, *ptr_command, *ptr_commands; + char str_id[64]; struct t_gui_buffer *ptr_buffer; struct t_hashtable *options; char str_delay[32]; @@ -490,19 +491,21 @@ RELAY_API_PROTOCOL_CALLBACK(input) if (!json_body) return WEECHAT_RC_ERROR; - json_buffer = cJSON_GetObjectItem (json_body, "buffer"); - if (json_buffer) + json_buffer_id = cJSON_GetObjectItem (json_body, "buffer_id"); + if (json_buffer_id) { - if (cJSON_IsString (json_buffer)) + if (cJSON_IsNumber (json_buffer_id)) { - ptr_buffer_name = cJSON_GetStringValue (json_buffer); - ptr_buffer = weechat_buffer_search ("==", ptr_buffer_name); + snprintf (str_id, sizeof (str_id), + "%lld", (long long)json_buffer_id->valuedouble); + ptr_buffer = weechat_buffer_search ("==id", str_id); if (!ptr_buffer) { - relay_api_msg_send_error_json (client, - RELAY_HTTP_404_NOT_FOUND, NULL, - "Buffer \"%s\" not found", - ptr_buffer_name); + relay_api_msg_send_error_json ( + client, + RELAY_HTTP_404_NOT_FOUND, NULL, + "Buffer \"%lld\" not found", + (long long)json_buffer_id->valuedouble); cJSON_Delete (json_body); return WEECHAT_RC_OK; } @@ -510,7 +513,29 @@ RELAY_API_PROTOCOL_CALLBACK(input) } else { - ptr_buffer = weechat_buffer_search_main (); + json_buffer_name = cJSON_GetObjectItem (json_body, "buffer_name"); + if (json_buffer_name) + { + if (cJSON_IsString (json_buffer_name)) + { + ptr_buffer_name = cJSON_GetStringValue (json_buffer_name); + ptr_buffer = weechat_buffer_search ("==", ptr_buffer_name); + if (!ptr_buffer) + { + relay_api_msg_send_error_json ( + client, + RELAY_HTTP_404_NOT_FOUND, NULL, + "Buffer \"%s\" not found", + ptr_buffer_name); + cJSON_Delete (json_body); + return WEECHAT_RC_OK; + } + } + } + else + { + ptr_buffer = weechat_buffer_search_main (); + } } if (!ptr_buffer) { diff --git a/tests/unit/plugins/relay/api/test-relay-api-protocol.cpp b/tests/unit/plugins/relay/api/test-relay-api-protocol.cpp index 96ae2aa62..8173a4b88 100644 --- a/tests/unit/plugins/relay/api/test-relay-api-protocol.cpp +++ b/tests/unit/plugins/relay/api/test-relay-api-protocol.cpp @@ -482,6 +482,7 @@ TEST(RelayApiProtocolWithClient, CbBuffers) TEST(RelayApiProtocolWithClient, CbInput) { + char str_body[1024]; int old_delay; /* error: no body */ @@ -494,7 +495,7 @@ TEST(RelayApiProtocolWithClient, CbInput) /* error: invalid buffer name */ test_client_recv_http ("POST /api/input", - "{\"buffer\": \"invalid\", " + "{\"buffer_name\": \"invalid\", " "\"command\": \"/print test\"}"); STRCMP_EQUAL("HTTP/1.1 404 Not Found\r\n" "Content-Type: application/json; charset=utf-8\r\n" @@ -519,12 +520,26 @@ TEST(RelayApiProtocolWithClient, CbInput) old_delay = relay_api_protocol_command_delay; relay_api_protocol_command_delay = 0; test_client_recv_http ("POST /api/input", - "{\"buffer\": \"core.weechat\", " + "{\"buffer_name\": \"core.weechat\", " "\"command\": \"/print test from relay 2\"}"); relay_api_protocol_command_delay = old_delay; record_stop (); WEE_CHECK_HTTP_CODE(204, "No Content"); CHECK(record_search ("core.weechat", "", "test from relay 2", NULL)); + + /* on core buffer, with buffer id */ + record_start (); + old_delay = relay_api_protocol_command_delay; + relay_api_protocol_command_delay = 0; + snprintf (str_body, sizeof (str_body), + "{\"buffer_id\": %lld, " + "\"command\": \"/print test from relay 3\"}", + gui_buffers->id); + test_client_recv_http ("POST /api/input", str_body); + relay_api_protocol_command_delay = old_delay; + record_stop (); + WEE_CHECK_HTTP_CODE(204, "No Content"); + CHECK(record_search ("core.weechat", "", "test from relay 3", NULL)); } /*