RSPAMD_MEMPOOL_MILTER_REPLY);
if (prev) {
+ /*
+ * We need to be very special about the add_headers part
+ * If we want to insert some existing object, such as
+ * add_headers = {
+ * hdr = {value = val1, order = 1},
+ * }
+ *
+ * and new header has something similar:
+ * add_headers = {
+ * hdr = {value = val2, order = 1},
+ * }
+ *
+ * then we need to convert it to an array...
+ *
+ * add_headers = {
+ * hdr = [{value = val1, order = 1}, {value = val2, order = 1}],
+ * }
+ *
+ * UCL itself cannot do it directly. So the trick is to extract the
+ * original object, pack it into an array and then insert it back.
+ *
+ * I wish there was a simplier way to do it...
+ */
+ const ucl_object_t *add_hdrs = ucl_object_lookup (prev, "add_headers");
+ const ucl_object_t *nadd_hdrs = ucl_object_lookup (reply, "add_headers");
+
+ if (add_hdrs && nadd_hdrs) {
+ ucl_object_iter_t it = NULL;
+ const ucl_object_t *cur;
+
+ while ((cur = ucl_object_iterate (nadd_hdrs, &it, true)) != NULL) {
+ gsize klen;
+ const gchar *key = ucl_object_keyl (cur, &klen);
+ const ucl_object_t *existing;
+
+ existing = ucl_object_lookup_len (add_hdrs, key, klen);
+
+ if (existing && ucl_object_type (existing) != UCL_ARRAY) {
+ ucl_object_t *ar = ucl_object_typed_new (UCL_ARRAY);
+
+ ucl_array_append (ar, ucl_object_ref (existing));
+ ucl_object_replace_key ((ucl_object_t *)add_hdrs,
+ ar, key, klen, false);
+ }
+ }
+ }
+
ucl_object_merge (prev, reply, false);
ucl_object_unref (reply);
}