]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Fix issues with scanning messages via controller.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 30 Apr 2014 22:09:26 +0000 (15:09 -0700)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 30 Apr 2014 22:09:26 +0000 (15:09 -0700)
src/controller.c
src/libmime/protocol.c
src/libmime/protocol.h
src/libserver/task.c

index 17efe8518f0f59006a58b27d9bec881018637087..58e2332c0a3d966ee9b29ea77fdf725922d7f2a4 100644 (file)
@@ -796,12 +796,10 @@ rspamd_controller_learn_fin_task (void *ud)
 
        if (!learn_task_spam (session->cl, task, session->is_spam, &err)) {
                rspamd_controller_send_error (conn_ent, 500 + err->code, err->message);
-               rspamd_http_connection_unref (conn_ent->conn);
                return TRUE;
        }
        /* Successful learn */
        rspamd_controller_send_string (conn_ent, "{\"success\":true}");
-       rspamd_http_connection_unref (conn_ent->conn);
 
        return TRUE;
 }
@@ -811,12 +809,18 @@ rspamd_controller_check_fin_task (void *ud)
 {
        struct rspamd_task                                              *task = ud;
        struct rspamd_http_connection_entry             *conn_ent;
+       struct rspamd_http_message *msg;
 
        conn_ent = task->fin_arg;
-       task->http_conn = conn_ent->conn;
-       rspamd_protocol_write_reply (task);
+       msg = rspamd_http_new_message (HTTP_RESPONSE);
+       msg->date = time (NULL);
+       msg->code = 200;
+       rspamd_protocol_http_reply (msg, task);
+       rspamd_http_connection_reset (conn_ent->conn);
+       rspamd_http_connection_write_message (conn_ent->conn, msg, NULL,
+                       "application/json", conn_ent, conn_ent->conn->fd, conn_ent->rt->ptv,
+                       conn_ent->rt->ev_base);
        conn_ent->is_reply = TRUE;
-       rspamd_http_connection_unref (conn_ent->conn);
 
        return TRUE;
 }
@@ -854,17 +858,19 @@ rspamd_controller_handle_learn_common (struct rspamd_http_connection_entry *conn
        }
 
        task = rspamd_task_new (session->ctx->worker);
-       task->ev_base = session->ctx->ev_base;
        task->msg = msg->body;
 
        task->resolver = ctx->resolver;
        task->ev_base = ctx->ev_base;
 
-       rspamd_http_connection_ref (conn_ent->conn);
+
        task->s = new_async_session (session->pool, rspamd_controller_learn_fin_task, NULL,
                        rspamd_task_free_hard, task);
        task->s->wanna_die = TRUE;
        task->fin_arg = conn_ent;
+       task->http_conn = rspamd_http_connection_ref (conn_ent->conn);;
+       task->sock = conn_ent->conn->fd;
+
 
        if (!rspamd_task_process (task, msg, NULL, FALSE)) {
                msg_warn ("filters cannot be processed for %s", task->message_id);
@@ -941,11 +947,12 @@ rspamd_controller_handle_scan (struct rspamd_http_connection_entry *conn_ent,
        task->resolver = ctx->resolver;
        task->ev_base = ctx->ev_base;
 
-       rspamd_http_connection_ref (conn_ent->conn);
        task->s = new_async_session (session->pool, rspamd_controller_check_fin_task, NULL,
                        rspamd_task_free_hard, task);
        task->s->wanna_die = TRUE;
        task->fin_arg = conn_ent;
+       task->http_conn = rspamd_http_connection_ref (conn_ent->conn);
+       task->sock = conn_ent->conn->fd;
 
        if (!rspamd_task_process (task, msg, NULL, FALSE)) {
                msg_warn ("filters cannot be processed for %s", task->message_id);
index 57ef9fe42bcaf67342ed63cd95612ccb50183cec..52336c81ce57ab61d4fb15d800ff03654ce03566 100644 (file)
@@ -697,8 +697,8 @@ rspamd_ucl_tolegacy_output (struct rspamd_task *task, ucl_object_t *top, GString
        g_string_append_printf (out, "Message-ID: %s\r\n", task->message_id);
 }
 
-static void
-write_check_reply (struct rspamd_http_message *msg, struct rspamd_task *task)
+void
+rspamd_protocol_http_reply (struct rspamd_http_message *msg, struct rspamd_task *task)
 {
        GString                         *logbuf;
        struct metric_result           *metric_res;
@@ -794,7 +794,7 @@ rspamd_protocol_write_reply (struct rspamd_task *task)
                case CMD_SYMBOLS:
                case CMD_PROCESS:
                case CMD_SKIP:
-                       write_check_reply (msg, task);
+                       rspamd_protocol_http_reply (msg, task);
                        break;
                case CMD_PING:
                        msg->body = g_string_new ("pong");
index 8d2efe118cd56e31c252e21b4ba4af3667207780..b3643ac7a6e3c47a283e73834796bfa6dae84561 100644 (file)
@@ -28,6 +28,13 @@ struct metric;
  */
 gboolean rspamd_protocol_handle_request (struct rspamd_task *task, struct rspamd_http_message *msg);
 
+/**
+ * Write task results to http message
+ * @param msg
+ * @param task
+ */
+void rspamd_protocol_http_reply (struct rspamd_http_message *msg, struct rspamd_task *task);
+
 /**
  * Write reply for specified task command
  * @param task task object
index 04e385479a911bf2cd3644ab153b15ab9d88cfbc..27ddf63ca3b2c0824ff9612f23c6af5d20742cdd 100644 (file)
@@ -96,6 +96,7 @@ rspamd_task_new (struct rspamd_worker *worker)
                                        new_task->urls);
        new_task->sock = -1;
        new_task->is_mime = TRUE;
+       new_task->is_json = TRUE;
        new_task->pre_result.action = METRIC_ACTION_NOACTION;
 
        new_task->message_id = new_task->queue_id = "undef";