From: Vsevolod Stakhov Date: Wed, 15 Oct 2025 14:32:22 +0000 (+0100) Subject: [Feature] Add milter.add_headers object format support to rspamc --mime X-Git-Tag: 3.14.0~74^2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8e28b10df99c8a221434286ad463edd1dceb4ae6;p=thirdparty%2Frspamd.git [Feature] Add milter.add_headers object format support to rspamc --mime Support milter.add_headers entries in {order: N, value: "..."} object format in addition to plain strings and arrays. This format is used by lua_mime.modify_headers() to control header insertion order. --- diff --git a/src/client/rspamc.cxx b/src/client/rspamc.cxx index 1d6c93593b..af3a13f0a5 100644 --- a/src/client/rspamc.cxx +++ b/src/client/rspamc.cxx @@ -1916,7 +1916,15 @@ rspamc_mime_output(FILE *out, ucl_object_t *result, GString *input, it = nullptr; while ((cur = ucl_object_iterate(add_headers, &it, true)) != nullptr) { const char *header_name = ucl_object_key(cur); - if (ucl_object_type(cur) == UCL_STRING) { + if (ucl_object_type(cur) == UCL_OBJECT) { + /* Handle {order: N, value: "..."} format */ + const auto *value_obj = ucl_object_lookup(cur, "value"); + if (value_obj) { + fmt::format_to(std::back_inserter(added_headers), "{}: {}{}", + header_name, ucl_object_tostring(value_obj), line_end); + } + } + else if (ucl_object_type(cur) == UCL_STRING) { fmt::format_to(std::back_inserter(added_headers), "{}: {}{}", header_name, ucl_object_tostring(cur), line_end); } @@ -1924,8 +1932,17 @@ rspamc_mime_output(FILE *out, ucl_object_t *result, GString *input, ucl_object_iter_t header_it = nullptr; const ucl_object_t *header_value; while ((header_value = ucl_object_iterate(cur, &header_it, true)) != nullptr) { - fmt::format_to(std::back_inserter(added_headers), "{}: {}{}", - header_name, ucl_object_tostring(header_value), line_end); + if (ucl_object_type(header_value) == UCL_OBJECT) { + const auto *value_obj = ucl_object_lookup(header_value, "value"); + if (value_obj) { + fmt::format_to(std::back_inserter(added_headers), "{}: {}{}", + header_name, ucl_object_tostring(value_obj), line_end); + } + } + else { + fmt::format_to(std::back_inserter(added_headers), "{}: {}{}", + header_name, ucl_object_tostring(header_value), line_end); + } } } }