From: Vsevolod Stakhov Date: Wed, 30 Apr 2014 22:09:26 +0000 (-0700) Subject: Fix issues with scanning messages via controller. X-Git-Tag: 0.7.0~250 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e7507e024d6c168aa43543f3a064c19c64d3f55b;p=thirdparty%2Frspamd.git Fix issues with scanning messages via controller. --- diff --git a/src/controller.c b/src/controller.c index 17efe8518f..58e2332c0a 100644 --- a/src/controller.c +++ b/src/controller.c @@ -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); diff --git a/src/libmime/protocol.c b/src/libmime/protocol.c index 57ef9fe42b..52336c81ce 100644 --- a/src/libmime/protocol.c +++ b/src/libmime/protocol.c @@ -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"); diff --git a/src/libmime/protocol.h b/src/libmime/protocol.h index 8d2efe118c..b3643ac7a6 100644 --- a/src/libmime/protocol.h +++ b/src/libmime/protocol.h @@ -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 diff --git a/src/libserver/task.c b/src/libserver/task.c index 04e385479a..27ddf63ca3 100644 --- a/src/libserver/task.c +++ b/src/libserver/task.c @@ -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";