summaryrefslogtreecommitdiffstats
path: root/src/libserver
diff options
context:
space:
mode:
Diffstat (limited to 'src/libserver')
-rw-r--r--src/libserver/composites.c9
-rw-r--r--src/libserver/protocol.c25
-rw-r--r--src/libserver/roll_history.c3
-rw-r--r--src/libserver/symbols_cache.c26
-rw-r--r--src/libserver/task.c9
-rw-r--r--src/libserver/task.h4
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 */