From: Vsevolod Stakhov Date: Wed, 17 Dec 2008 16:23:32 +0000 (+0300) Subject: * Add function for adding rspamd report headers X-Git-Tag: 0.2.7~333 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=9e9ced325226942bbfb6c4aa307f388044e29b23;p=rspamd.git * Add function for adding rspamd report headers --- diff --git a/src/filter.c b/src/filter.c index 5bf0db27a..64d492e62 100644 --- a/src/filter.c +++ b/src/filter.c @@ -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 */ diff --git a/src/filter.h b/src/filter.h index ce8be7ecd..dec13fd72 100644 --- a/src/filter.h +++ b/src/filter.h @@ -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); diff --git a/src/worker.c b/src/worker.c index 268e8123b..d18b260b8 100644 --- a/src/worker.c +++ b/src/worker.c @@ -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);