diff options
Diffstat (limited to 'src/libserver')
-rw-r--r-- | src/libserver/composites.c | 9 | ||||
-rw-r--r-- | src/libserver/protocol.c | 25 | ||||
-rw-r--r-- | src/libserver/roll_history.c | 3 | ||||
-rw-r--r-- | src/libserver/symbols_cache.c | 26 | ||||
-rw-r--r-- | src/libserver/task.c | 9 | ||||
-rw-r--r-- | src/libserver/task.h | 4 |
6 files changed, 33 insertions, 43 deletions
diff --git a/src/libserver/composites.c b/src/libserver/composites.c index bf12799aa..89281b117 100644 --- a/src/libserver/composites.c +++ b/src/libserver/composites.c @@ -366,12 +366,11 @@ composites_remove_symbols (gpointer key, gpointer value, gpointer data) } static void -composites_metric_callback (gpointer key, gpointer value, gpointer data) +composites_metric_callback (struct rspamd_metric_result *metric_res, + struct rspamd_task *task) { - struct rspamd_task *task = (struct rspamd_task *)data; struct composites_data *cd = rspamd_mempool_alloc (task->task_pool, sizeof (struct composites_data)); - struct rspamd_metric_result *metric_res = (struct rspamd_metric_result *)value; cd->task = task; cd->metric_res = (struct rspamd_metric_result *)metric_res; @@ -394,7 +393,9 @@ composites_metric_callback (gpointer key, gpointer value, gpointer data) void rspamd_make_composites (struct rspamd_task *task) { - g_hash_table_foreach (task->results, composites_metric_callback, task); + if (task->result) { + composites_metric_callback (task->result, task); + } } diff --git a/src/libserver/protocol.c b/src/libserver/protocol.c index 4acf0202d..5a0a52de9 100644 --- a/src/libserver/protocol.c +++ b/src/libserver/protocol.c @@ -29,6 +29,12 @@ * described below */ #define MSG_CMD_CHECK "check" + +/* + * Modern check version + */ +#define MSG_CMD_CHECK_V2 "checkv2" + /* * Check if message is spam or not, and return score plus list * of symbols hit @@ -168,7 +174,10 @@ rspamd_protocol_handle_url (struct rspamd_task *task, case 'c': case 'C': /* check */ - if (g_ascii_strncasecmp (p, MSG_CMD_CHECK, pathlen) == 0) { + if (g_ascii_strncasecmp (p, MSG_CMD_CHECK_V2, pathlen) == 0) { + task->cmd = CMD_CHECK_V2; + } + else if (g_ascii_strncasecmp (p, MSG_CMD_CHECK, pathlen) == 0) { task->cmd = CMD_CHECK; } else { @@ -1116,13 +1125,8 @@ rspamd_protocol_write_ucl (struct rspamd_task *task, } if (flags & RSPAMD_PROTOCOL_METRICS) { - g_hash_table_iter_init (&hiter, task->results); - /* Convert results to an ucl object */ - while (g_hash_table_iter_next (&hiter, &h, &v)) { - metric_res = (struct rspamd_metric_result *)v; - obj = rspamd_metric_result_ucl (task, metric_res); - ucl_object_insert_key (top, obj, h, 0, false); - } + obj = rspamd_metric_result_ucl (task, task->result); + ucl_object_insert_key (top, obj, DEFAULT_METRIC, 0, false); } if (flags & RSPAMD_PROTOCOL_MESSAGES) { @@ -1328,7 +1332,8 @@ rspamd_protocol_http_reply (struct rspamd_http_message *msg, end: if (!(task->flags & RSPAMD_TASK_FLAG_NO_STAT)) { /* Update stat for default metric */ - metric_res = g_hash_table_lookup (task->results, DEFAULT_METRIC); + metric_res = task->result; + if (metric_res != NULL) { if (metric_res->action != METRIC_ACTION_MAX) { @@ -1515,7 +1520,7 @@ rspamd_protocol_write_log_pipe (struct rspamd_worker_ctx *ctx, if (lp->fd != -1) { switch (lp->type) { case RSPAMD_LOG_PIPE_SYMBOLS: - mres = g_hash_table_lookup (task->results, DEFAULT_METRIC); + mres = task->result; if (mres) { n = g_hash_table_size (mres->symbols); diff --git a/src/libserver/roll_history.c b/src/libserver/roll_history.c index ea79b590b..01aa9f88a 100644 --- a/src/libserver/roll_history.c +++ b/src/libserver/roll_history.c @@ -143,7 +143,8 @@ rspamd_roll_history_update (struct roll_history *history, } /* Get default metric */ - metric_res = g_hash_table_lookup (task->results, DEFAULT_METRIC); + metric_res = task->result; + if (metric_res == NULL) { row->symbols[0] = '\0'; row->action = METRIC_ACTION_NOACTION; diff --git a/src/libserver/symbols_cache.c b/src/libserver/symbols_cache.c index b0f63134a..51addf04f 100644 --- a/src/libserver/symbols_cache.c +++ b/src/libserver/symbols_cache.c @@ -1158,34 +1158,22 @@ rspamd_symbols_cache_metric_limit (struct rspamd_task *task, struct cache_savepoint *cp) { struct rspamd_metric_result *res; - GList *cur; - struct rspamd_metric *metric; double ms; if (task->flags & RSPAMD_TASK_FLAG_PASS_ALL) { return FALSE; } - cur = task->cfg->metrics_list; - if (cp->lim == 0.0) { - /* - * Look for metric that has the maximum reject score - */ - while (cur) { - metric = cur->data; - res = g_hash_table_lookup (task->results, metric->name); + res = task->result; - if (res) { - ms = rspamd_task_get_required_score (task, res); + if (res) { + ms = rspamd_task_get_required_score (task, res); - if (!isnan (ms) && cp->lim < ms) { - cp->rs = res; - cp->lim = ms; - } + if (!isnan (ms) && cp->lim < ms) { + cp->rs = res; + cp->lim = ms; } - - cur = g_list_next (cur); } } @@ -1493,7 +1481,7 @@ rspamd_symbols_cache_make_checkpoint (struct rspamd_task *task, checkpoint->pass = RSPAMD_CACHE_PASS_INIT; task->checkpoint = checkpoint; - rspamd_create_metric_result (task, DEFAULT_METRIC); + task->result = rspamd_create_metric_result (task); return checkpoint; } diff --git a/src/libserver/task.c b/src/libserver/task.c index 95e682eed..4a8b35b9c 100644 --- a/src/libserver/task.c +++ b/src/libserver/task.c @@ -83,11 +83,6 @@ rspamd_task_new (struct rspamd_worker *worker, struct rspamd_config *cfg) new_task->task_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), "task"); - new_task->results = g_hash_table_new (rspamd_str_hash, rspamd_str_equal); - rspamd_mempool_add_destructor (new_task->task_pool, - (rspamd_mempool_destruct_t) g_hash_table_unref, - new_task->results); - new_task->raw_headers = g_hash_table_new_full (rspamd_strcase_hash, rspamd_strcase_equal, NULL, rspamd_ptr_array_free_hard); new_task->headers_order = g_queue_new (); @@ -987,7 +982,7 @@ rspamd_task_log_metric_res (struct rspamd_task *task, GPtrArray *sorted_symbols; guint i, j; - mres = g_hash_table_lookup (task->results, DEFAULT_METRIC); + mres = task->result; if (mres != NULL) { switch (lf->type) { @@ -1415,7 +1410,7 @@ rspamd_task_get_required_score (struct rspamd_task *task, struct rspamd_metric_r guint i; if (m == NULL) { - m = g_hash_table_lookup (task->results, DEFAULT_METRIC); + m = task->result; if (m == NULL) { return NAN; diff --git a/src/libserver/task.h b/src/libserver/task.h index e892e776f..549c49989 100644 --- a/src/libserver/task.h +++ b/src/libserver/task.h @@ -32,6 +32,7 @@ enum rspamd_command { CMD_SKIP, CMD_PING, CMD_PROCESS, + CMD_CHECK_V2, CMD_OTHER }; @@ -158,8 +159,7 @@ struct rspamd_task { GHashTable *emails; /**< list of parsed emails */ GHashTable *raw_headers; /**< list of raw headers */ GQueue *headers_order; /**< order of raw headers */ - GHashTable *results; /**< hash table of metric_result indexed by - * metric's name */ + struct rspamd_metric_result *result; /**< Metric result */ GHashTable *lua_cache; /**< cache of lua objects */ GPtrArray *tokens; /**< statistics tokens */ |