]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-lua: Add "set_event" and "get_event" function for dlua http_request
authorMarkus Valentin <markus.valentin@open-xchange.com>
Tue, 9 Dec 2025 14:11:23 +0000 (15:11 +0100)
committermarkus.valentin <markus.valentin@open-xchange.com>
Thu, 15 Jan 2026 10:13:15 +0000 (11:13 +0100)
src/lib-lua/dlua-dovecot-http.c
src/lib-lua/test-lua-http-client.c
src/lib-lua/test-lua-http-client.lua

index fe793f7ef1f9fdf3b6218ea085bc70a89cd771be..38e0de648b5ec4b4834103f19988e6ea4cea1e92 100644 (file)
@@ -126,11 +126,35 @@ static int dlua_http_request_submit(lua_State *L)
        return 1;
 }
 
+static int dlua_http_request_set_event(lua_State *L)
+{
+       DLUA_REQUIRE_ARGS(L, 2);
+
+       struct http_client_request *req = dlua_check_http_request(L, 1);
+       struct event *event = dlua_check_event(L, 2);
+
+       http_client_request_set_event(req, event);
+
+       return 0;
+}
+
+static int dlua_http_request_get_event(lua_State *L)
+{
+       DLUA_REQUIRE_ARGS(L, 1);
+
+       struct http_client_request *req = dlua_check_http_request(L, 1);
+       dlua_push_event(L, req->event);
+
+       return 1;
+}
+
 static luaL_Reg lua_dovecot_http_request_methods[] = {
        { "add_header", dlua_http_request_add_header },
        { "remove_header", dlua_http_request_remove_header },
        { "set_payload", dlua_http_request_set_payload },
        { "submit", dlua_http_request_submit },
+       { "set_event", dlua_http_request_set_event },
+       { "get_event", dlua_http_request_get_event },
        { NULL, NULL }
 };
 
index 29239cbca176ac54969f615139bf74fecac879c1..f925040dcdad034270dcef60f83523dd82652c52 100644 (file)
@@ -430,6 +430,69 @@ static void test_bad_settings(void)
        test_end();
 }
 
+static void test_set_event(void)
+{
+       struct dlua_script *script;
+       const char *error;
+
+       test_begin("set event");
+
+       if (dlua_script_create_file(
+               TEST_LUA_SCRIPT_DIR "/test-lua-http-client.lua",
+               &script, common_event, &error) < 0)
+               i_fatal("dlua_script_create_file() failed: %s", error);
+
+
+       dlua_dovecot_register(script);
+       if (dlua_script_init(script, &error) < 0)
+               i_fatal("dlua_script_init() failed: %s", error);
+
+       struct event *event = event_create(NULL);
+       event_set_forced_debug(event, TRUE);
+       dlua_push_event(script->L, event);
+       lua_pushstring(script->L, "https://localhost");
+       test_assert(dlua_pcall(script->L, "test_http_request_set_event", 2, 1, &error) == 1);
+       struct event *child_event = dlua_check_event(script->L, 1);
+       test_assert(event_get_parent(child_event) == event);
+       test_assert(event_get_parent(child_event) != common_event);
+       event_unref(&event);
+       dlua_script_unref(&script);
+
+       test_end();
+}
+
+static void test_set_no_event(void)
+{
+       struct dlua_script *script;
+       const char *error;
+
+       test_begin("set no event");
+
+       if (dlua_script_create_file(
+               TEST_LUA_SCRIPT_DIR "/test-lua-http-client.lua",
+               &script, common_event, &error) < 0)
+               i_fatal("dlua_script_create_file() failed: %s", error);
+
+
+       dlua_dovecot_register(script);
+       if (dlua_script_init(script, &error) < 0)
+               i_fatal("dlua_script_init() failed: %s", error);
+
+       struct event *event = event_create(NULL);
+       event_set_forced_debug(event, TRUE);
+       dlua_push_event(script->L, event);
+       lua_pushstring(script->L, "https://localhost");
+       test_assert(dlua_pcall(script->L, "test_http_request_set_no_event", 2, 1, &error) == 1);
+       struct event *child_event = dlua_check_event(script->L, 1);
+       /* if request:set_event() is not used the returned event
+          will not be a child of the event previously created */
+       test_assert(event_get_parent(child_event) != event);
+       event_unref(&event);
+       dlua_script_unref(&script);
+
+       test_end();
+}
+
 /*
  * All tests
  */
@@ -438,6 +501,8 @@ static void (*const test_functions[])(void) = {
        test_simple_post,
        test_second_post,
        test_bad_settings,
+       test_set_event,
+       test_set_no_event,
        NULL
 };
 
index 0d740495df0bbdc6c3043dd8090db4a59cf978be..9b49b093264b96fa6a88faa6c4c6a50c481295b7 100644 (file)
@@ -75,3 +75,26 @@ function test_invalid_set_value_3()
   })
   return 0
 end
+
+function test_http_request_set_event(event, url)
+  local request = http_client:request {
+    url = url,
+    method = "POST"
+  }
+  request:add_header("Cache-Control", "no-cache")
+  request:add_header("Content-Type", "application/x-www-form-urlencoded")
+  request:set_payload("some+foolish+payload+for+funsies\r\n", true)
+  request:set_event(event)
+  return request:get_event()
+end
+
+function test_http_request_set_no_event(event, url)
+  local request = http_client:request {
+    url = url,
+    method = "POST"
+  }
+  request:add_header("Cache-Control", "no-cache")
+  request:add_header("Content-Type", "application/x-www-form-urlencoded")
+  request:set_payload("some+foolish+payload+for+funsies\r\n", true)
+  return request:get_event()
+end