]> source.dussan.org Git - rspamd.git/commitdiff
Load control chunk.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 30 Mar 2015 12:41:32 +0000 (13:41 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 30 Mar 2015 12:41:32 +0000 (13:41 +0100)
src/libserver/protocol.c
src/libserver/task.c
src/libserver/task.h

index 08e7bc3c3d3735c7a08813620e0a802942b08779..1f5b1f4470856039ff07e985393e6b00d0839cfa 100644 (file)
@@ -397,6 +397,9 @@ rspamd_protocol_handle_headers (struct rspamd_task *task,
                                        msg_err ("Invalid message length header: %s", h->value->str);
                                        validh = FALSE;
                                }
+                               else {
+                                       task->flags |= RSPAMD_TASK_FLAG_HAS_CONTROL;
+                               }
                        }
                        else {
                                validh = FALSE;
index be6bd134c088beb0c5b29471daedbea96d433399..4c8934ada82cfe2eb9a7871c1830ca44c2abd693 100644 (file)
@@ -309,6 +309,9 @@ rspamd_task_process (struct rspamd_task *task,
        gboolean process_extra_filters)
 {
        gint r;
+       guint control_len;
+       struct ucl_parser *parser;
+       ucl_object_t *control_obj;
        GError *err = NULL;
 
        task->msg.start = start;
@@ -320,6 +323,36 @@ rspamd_task_process (struct rspamd_task *task,
 
        rspamd_protocol_handle_headers (task, msg);
 
+       if (task->flags & RSPAMD_TASK_FLAG_HAS_CONTROL) {
+               /* We have control chunk, so we need to process it separately */
+               if (task->msg.len < task->message_len) {
+                       msg_warn ("message has invalid message length: %ud and total len: %ud",
+                                       task->message_len, task->msg.len);
+                       task->last_error = "Invalid length";
+                       task->error_code = RSPAMD_PROTOCOL_ERROR;
+                       task->state = WRITE_REPLY;
+                       return FALSE;
+               }
+               control_len = task->msg.len - task->message_len;
+
+               if (control_len > 0) {
+                       parser = ucl_parser_new (UCL_PARSER_KEY_LOWERCASE);
+
+                       if (!ucl_parser_add_chunk (parser, task->msg.start, control_len)) {
+                               msg_warn ("processing of control chunk failed: %s",
+                                       ucl_parser_get_error (parser));
+                               ucl_parser_free (parser);
+                       }
+                       else {
+                               control_obj = ucl_parser_get_object (parser);
+                               ucl_parser_free (parser);
+                       }
+
+                       task->msg.start += control_len;
+                       task->msg.len -= control_len;
+               }
+       }
+
        r = process_message (task);
        if (r == -1) {
                msg_warn ("processing of message failed");
index 52c45c9d4eb042c293b4e68d98d1759d528025cd..d4f92fd8d46295dff21dffc7ea0616906d18e983 100644 (file)
@@ -60,7 +60,7 @@ enum rspamd_metric_action {
 #define RSPAMD_TASK_FLAG_PASS_ALL (1 << 6)
 #define RSPAMD_TASK_FLAG_NO_LOG (1 << 7)
 #define RSPAMD_TASK_FLAG_NO_IP (1 << 8)
-#define RSPAMD_TASK_FLAG_HAS_JSON (1 << 9)
+#define RSPAMD_TASK_FLAG_HAS_CONTROL (1 << 9)
 
 #define RSPAMD_TASK_IS_SKIPPED(task) (((task)->flags & RSPAMD_TASK_FLAG_SKIP))
 #define RSPAMD_TASK_IS_JSON(task) (((task)->flags & RSPAMD_TASK_FLAG_JSON))