]> source.dussan.org Git - rspamd.git/commitdiff
Fix states logic broken by the previous commit.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 27 May 2015 15:45:08 +0000 (16:45 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 27 May 2015 15:45:08 +0000 (16:45 +0100)
src/libmime/filter.c
src/libserver/events.c
src/libserver/events.h
src/libserver/task.c
src/worker.c

index a2c214d31d7d6b4726f3ff5dc621fdbed14eafdb..3a76232b9ee78573718e615fa2c3b880c88a6c4c 100644 (file)
@@ -431,7 +431,9 @@ rspamd_process_filters (struct rspamd_task *task)
                }
        }
 
-       task->state = WAIT_FILTER;
+       if (rspamd_session_events_pending (task->s) != 0) {
+               task->state = WAIT_FILTER;
+       }
 
        return 1;
 }
index 4925b8c69e45b5c84cf30773a84f7fbf1b43ca00..a453cf4591554b9b9168a7a78cca520e23f0e343 100644 (file)
@@ -284,3 +284,12 @@ rspamd_session_watch_stop (struct rspamd_async_session *s)
 
        return remain;
 }
+
+
+guint
+rspamd_session_events_pending (struct rspamd_async_session *session)
+{
+       g_assert (session != NULL);
+
+       return g_hash_table_size (session->events);
+}
index 46f7ae0ef1cc48eb7ff2d6860c2b9497acd5896a..b2f463b5bbe5a19d501b6502fbf4faba52058fb3 100644 (file)
@@ -81,6 +81,13 @@ gboolean rspamd_session_destroy (struct rspamd_async_session *session);
  */
 gboolean rspamd_session_pending (struct rspamd_async_session *session);
 
+/**
+ * Returns number of events pending
+ * @param session
+ * @return
+ */
+guint rspamd_session_events_pending (struct rspamd_async_session *session);
+
 /**
  * Start watching for events in the session, so the specified watcher will be added
  * to all subsequent events until `rspamd_session_watch_stop` is called
index 502fdfb8d1d707eaf142b6d85d3210daf0df90b1..4833c083524d3fc1a592c441d1de45a226f6c46c 100644 (file)
@@ -355,11 +355,11 @@ rspamd_task_process (struct rspamd_task *task,
        else {
                rspamd_lua_call_pre_filters (task);
                /* We want fin_task after pre filters are processed */
-               task->state = WAIT_PRE_FILTER;
+               if (rspamd_session_events_pending (task->s) != 0) {
+                       task->state = WAIT_PRE_FILTER;
+               }
        }
 
-       rspamd_session_pending (task->s);
-
        return TRUE;
 }
 
index e59054414f0f2f6699f13eed0008819e5f58fee7..f142da22c26997caf68a45172490413fc1724abe 100644 (file)
@@ -106,13 +106,13 @@ rspamd_worker_body_handler (struct rspamd_http_connection *conn,
 
        ctx = task->worker->ctx;
 
+       task->state = WRITE_REPLY;
+
        if (!rspamd_protocol_handle_request (task, msg)) {
-               task->state = WRITE_REPLY;
                return 0;
        }
 
        if (task->cmd == CMD_PING) {
-               task->state = WRITE_REPLY;
                return 0;
        }
 
@@ -120,14 +120,11 @@ rspamd_worker_body_handler (struct rspamd_http_connection *conn,
                msg_err ("got zero length body, cannot continue");
                task->last_error = "message's body is empty";
                task->error_code = RSPAMD_LENGTH_ERROR;
-               task->state = WRITE_REPLY;
+
                return 0;
        }
 
-
-       if (!rspamd_task_process (task, msg, chunk, len, TRUE)) {
-               task->state = WRITE_REPLY;
-       }
+       rspamd_task_process (task, msg, chunk, len, TRUE);
 
        return 0;
 }
@@ -149,7 +146,7 @@ rspamd_worker_finish_handler (struct rspamd_http_connection *conn,
 {
        struct rspamd_task *task = (struct rspamd_task *) conn->ud;
 
-       if (task->state == CLOSING_CONNECTION) {
+       if (task->state == CLOSING_CONNECTION || task->state == WRITING_REPLY) {
                /* We are done here */
                msg_debug ("normally closing connection from: %s",
                        rspamd_inet_address_to_string (task->client_addr));
@@ -163,16 +160,6 @@ rspamd_worker_finish_handler (struct rspamd_http_connection *conn,
                 */
                msg_debug ("want write message to the wire: %s",
                        rspamd_inet_address_to_string (task->client_addr));
-               rspamd_protocol_write_reply (task);
-               /* Forcefully set the state */
-               task->state = CLOSING_CONNECTION;
-       }
-       else if (task->state == WRITING_REPLY) {
-               msg_debug ("still writing reply to: %s",
-                       rspamd_inet_address_to_string (task->client_addr));
-               task->state = CLOSING_CONNECTION;
-       }
-       else {
                /*
                 * If all filters have finished their tasks, this function will trigger
                 * writing a reply.