]> source.dussan.org Git - rspamd.git/commitdiff
* Add function for adding rspamd report headers
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Wed, 17 Dec 2008 16:23:32 +0000 (19:23 +0300)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Wed, 17 Dec 2008 16:23:32 +0000 (19:23 +0300)
src/filter.c
src/filter.h
src/worker.c

index 5bf0db27a0a316a86933430f0a3d3556fe582632..64d492e6236db1d5da5c48616660e8650a5982e7 100644 (file)
@@ -441,6 +441,47 @@ process_statfiles (struct worker_task *task)
        g_hash_table_destroy (cd.metrics);
 }
 
+static void
+insert_metric_header (gpointer metric_name, gpointer metric_value, gpointer data)
+{
+       struct worker_task *task = (struct worker_task *)data;
+       int r = 0;
+       /* Try to be rfc2822 compatible and avoid long headers with folding */
+       char header_name[128], outbuf[1000];
+       GList *symbols = NULL, *cur;
+       struct metric_result *metric_res = (struct metric_result *)metric_value;
+       
+       snprintf (header_name, sizeof (header_name), "X-Spam-%s", metric_res->metric->name);
+
+       if (metric_res->score >= metric_res->metric->required_score) {
+               r += snprintf (outbuf + r, sizeof (outbuf) - r, "yes; %.2f/%.2f; ", metric_res->score, metric_res->metric->required_score);
+       }
+       else {
+               r += snprintf (outbuf + r, sizeof (outbuf) - r, "no; %.2f/%.2f; ", metric_res->score, metric_res->metric->required_score);
+       }
+
+       symbols = g_hash_table_get_keys (metric_res->symbols);
+       cur = symbols;
+       while (cur) {
+               if (g_list_next (cur) != NULL) {
+                       r += snprintf (outbuf + r, sizeof (outbuf) - r, "%s,", (char *)cur->data);
+               }
+               else {
+                       r += snprintf (outbuf + r, sizeof (outbuf) - r, "%s", (char *)cur->data);
+               }
+               cur = g_list_next (cur);
+       }
+       g_list_free (symbols);
+       g_mime_message_add_header (task->message, header_name, outbuf);
+
+}
+
+void
+insert_headers (struct worker_task *task)
+{
+       g_hash_table_foreach (task->results, insert_metric_header, task);
+}
+
 /* 
  * vi:ts=4 
  */
index ce8be7ecd8eb85aac13883be396c7b81ddb62c13..dec13fd72815e78c26d9c335145ef56fc63eb4b2 100644 (file)
@@ -36,6 +36,7 @@ struct metric_result {
 };
 
 int process_filters (struct worker_task *task);
+void process_statfiles (struct worker_task *task);
 void insert_result (struct worker_task *task, const char *metric_name, const char *symbol, u_char flag);
 void make_composites (struct worker_task *task);
 double factor_consolidation_func (struct worker_task *task, const char *metric_name);
index 268e8123b0d40612285ad95feba7b8f8b71b2685..d18b260b88cd16172a22ced09bbfcc23ac35daef 100644 (file)
@@ -232,6 +232,9 @@ read_socket (struct bufferevent *bev, void *arg)
                                        else if (r == 1) {
                                                task->state = WAIT_FILTER;
                                        }
+                                       else {
+                                               process_statfiles (task);
+                                       }
                                }
                                if (task->state == WRITE_ERROR || task->state == WRITE_REPLY) {
                                        bufferevent_enable (bev, EV_WRITE);