]> source.dussan.org Git - rspamd.git/commitdiff
* Add urls output to urls command
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Thu, 2 Jul 2009 11:51:16 +0000 (15:51 +0400)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Thu, 2 Jul 2009 11:51:16 +0000 (15:51 +0400)
* Improve performance of dispatcher by avoiding double allocating and copying of dynamic buffers

src/buffer.c
src/buffer.h
src/controller.c
src/lmtp.c
src/lmtp_proto.c
src/plugins/emails.c
src/plugins/surbl.c
src/protocol.c
src/url.h

index bff75fc39dcf9c1632fd9d99a689313909725570..f8d027307bb3f6c4cf119644c51b42da7264f947 100644 (file)
@@ -375,15 +375,23 @@ rspamd_set_dispatcher_policy (rspamd_io_dispatcher_t *d,
 void 
 rspamd_dispatcher_write (rspamd_io_dispatcher_t *d,
                                                                        void *data,
-                                                                       size_t len, gboolean delayed)
+                                                                       size_t len, gboolean delayed, gboolean allocated)
 {
        rspamd_buffer_t *newbuf;
 
        newbuf = memory_pool_alloc (d->pool, sizeof (rspamd_buffer_t));
-       newbuf->data = fstralloc (d->pool, len);
-       
-       /* We need to copy data to temporary internal buffer to avoid using of stack variables */
-       memcpy (newbuf->data->begin, data, len);
+       if (!allocated) {
+               newbuf->data = fstralloc (d->pool, len);
+               
+               /* We need to copy data to temporary internal buffer to avoid using of stack variables */
+               memcpy (newbuf->data->begin, data, len);
+       }
+       else {
+               newbuf->data = memory_pool_alloc (d->pool, sizeof (f_str_t));
+               newbuf->data->begin = data;
+               newbuf->data->size = len;
+       }
+
        newbuf->pos = newbuf->data->begin;
        newbuf->data->len = len;
        
index 4c9e5c905655666fd07b07c113baa7537bbe3d31..458ea32ded9d179f5d57195d1ea31097853ce59c 100644 (file)
@@ -83,7 +83,7 @@ void rspamd_set_dispatcher_policy (rspamd_io_dispatcher_t *d,
  */
 void rspamd_dispatcher_write (rspamd_io_dispatcher_t *d,
                                                                                                  void *data,
-                                                                                                 size_t len, gboolean delayed);
+                                                                                                 size_t len, gboolean delayed, gboolean allocated);
 
 /**
  * Pause IO events on dispatcher
index e45075f9eded5ebc953a5dd09b5f3e87f8bd211b..4b0f7ae635f9bc74faf3c94ca4807097669f8d3a 100644 (file)
@@ -144,7 +144,7 @@ check_auth (struct controller_command *cmd, struct controller_session *session)
 
        if (cmd->privilleged && !session->authorized) {
                r = snprintf (out_buf, sizeof (out_buf), "not authorized" CRLF);
-               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                return 0;
        }
 
@@ -161,7 +161,7 @@ counter_write_callback (gpointer key, gpointer value, void *data)
        int r;
 
        r = snprintf (out_buf, sizeof (out_buf), "%s: %llu" CRLF, name, (unsigned long long int)cd->value);
-       rspamd_dispatcher_write (session->dispatcher, out_buf, r, TRUE);
+       rspamd_dispatcher_write (session->dispatcher, out_buf, r, TRUE, FALSE);
 }
 
 static void
@@ -182,23 +182,23 @@ process_command (struct controller_command *cmd, char **cmd_args, struct control
                        if (!arg || *arg == '\0') {
                                msg_debug ("process_command: empty password passed");
                                r = snprintf (out_buf, sizeof (out_buf), "password command requires one argument" CRLF);
-                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                                return;
                        }
                        if (password == NULL) {
                                r = snprintf (out_buf, sizeof (out_buf), "password command disabled in config, authorized access unallowed" CRLF);
-                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                                return;
                        }
                        if (strncmp (arg, password, strlen (arg)) == 0) {
                                session->authorized = 1;
                                r = snprintf (out_buf, sizeof (out_buf), "password accepted" CRLF);
-                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                        }
                        else {
                                session->authorized = 0;
                                r = snprintf (out_buf, sizeof (out_buf), "password NOT accepted" CRLF);
-                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                        }
                        break;
                case COMMAND_QUIT:
@@ -207,7 +207,7 @@ process_command (struct controller_command *cmd, char **cmd_args, struct control
                case COMMAND_RELOAD:
                        if (check_auth (cmd, session)) {
                                r = snprintf (out_buf, sizeof (out_buf), "reload request sent" CRLF);
-                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                                kill (getppid (), SIGHUP);
                        }
                        break;
@@ -236,13 +236,13 @@ process_command (struct controller_command *cmd, char **cmd_args, struct control
                                                          (long int)mem_st.chunks_freed);
                                r += snprintf (out_buf + r, sizeof (out_buf) - r, "Oversized chunks: %ld" CRLF,
                                                          (long int)mem_st.oversized_chunks);
-                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                        }
                        break;
                case COMMAND_SHUTDOWN:
                        if (check_auth (cmd, session)) {
                                r = snprintf (out_buf, sizeof (out_buf), "shutdown request sent" CRLF);
-                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                                kill (getppid (), SIGTERM);
                        }
                        break;
@@ -273,7 +273,7 @@ process_command (struct controller_command *cmd, char **cmd_args, struct control
                                                                minutes, minutes > 1 ? "s" : " ",
                                                                (int)uptime, uptime > 1 ? "s" : " ");
                                }
-                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                        }
                        break;
                case COMMAND_LEARN:
@@ -282,28 +282,28 @@ process_command (struct controller_command *cmd, char **cmd_args, struct control
                                if (!arg || *arg == '\0') {
                                        msg_debug ("process_command: no statfile specified in learn command");
                                        r = snprintf (out_buf, sizeof (out_buf), "learn command requires at least two arguments: stat filename and its size" CRLF);
-                                       rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                                       rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                                        return;
                                }
                                arg = *(cmd_args + 1);
                                if (arg == NULL || *arg == '\0') {
                                        msg_debug ("process_command: no statfile size specified in learn command");
                                        r = snprintf (out_buf, sizeof (out_buf), "learn command requires at least two arguments: stat filename and its size" CRLF);
-                                       rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                                       rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                                        return;
                                }
                                size = strtoul (arg, &err_str, 10);
                                if (err_str && *err_str != '\0') {
                                        msg_debug ("process_command: statfile size is invalid: %s", arg);
                                        r = snprintf (out_buf, sizeof (out_buf), "learn size is invalid" CRLF);
-                                       rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                                       rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                                        return;
                                }
 
                                statfile = g_hash_table_lookup (session->cfg->statfiles, *cmd_args);
                                if (statfile == NULL) {
                                        r = snprintf (out_buf, sizeof (out_buf), "statfile %s is not defined" CRLF, *cmd_args);
-                                       rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                                       rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                                        return;
 
                                }
@@ -331,7 +331,7 @@ process_command (struct controller_command *cmd, char **cmd_args, struct control
                                                                arg = *(cmd_args + 1);
                                                                if (!arg || *arg == '\0') {
                                                                        r = snprintf (out_buf, sizeof (out_buf), "recipient is not defined" CRLF);
-                                                                       rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                                                                       rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                                                                        return;
                                                                }
                                                                session->learn_rcpt = memory_pool_strdup (session->session_pool, arg);
@@ -340,7 +340,7 @@ process_command (struct controller_command *cmd, char **cmd_args, struct control
                                                                arg = *(cmd_args + 1);
                                                                if (!arg || *arg == '\0') {
                                                                        r = snprintf (out_buf, sizeof (out_buf), "from is not defined" CRLF);
-                                                                       rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                                                                       rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                                                                        return;
                                                                }
                                                                session->learn_from = memory_pool_strdup (session->session_pool, arg);
@@ -350,7 +350,7 @@ process_command (struct controller_command *cmd, char **cmd_args, struct control
                                                                break;
                                                        default:
                                                                r = snprintf (out_buf, sizeof (out_buf), "tokenizer is not defined" CRLF);
-                                                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                                                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                                                                return;
                                                }
                                        }
@@ -362,12 +362,12 @@ process_command (struct controller_command *cmd, char **cmd_args, struct control
                                        if (statfile_pool_create (session->worker->srv->statfile_pool, 
                                                                        session->learn_filename, statfile->size / sizeof (struct stat_file_block)) == -1) {
                                                r = snprintf (out_buf, sizeof (out_buf), "cannot create statfile %s" CRLF, session->learn_filename);
-                                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                                                return;
                                        }
                                        if (statfile_pool_open (session->worker->srv->statfile_pool, session->learn_filename) == -1) {
                                                r = snprintf (out_buf, sizeof (out_buf), "cannot open statfile %s" CRLF, session->learn_filename);
-                                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                                               rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                                                return;
                                        }
                                }
@@ -386,7 +386,7 @@ process_command (struct controller_command *cmd, char **cmd_args, struct control
                                                        "    stat - show different rspamd stat" CRLF
                                                        "    counters - show rspamd counters" CRLF
                                                        "    uptime - rspamd uptime" CRLF);
-                       rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE);
+                       rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE);
                        break;
                case COMMAND_COUNTERS:
                        rspamd_hash_foreach (counters, counter_write_callback, session);
@@ -422,12 +422,12 @@ controller_read_socket (f_str_t *in, void *arg)
                                        case 0:
                                                msg_debug ("Unknown command: '%s'", cmd);
                                                i = snprintf (out_buf, sizeof (out_buf), "Unknown command" CRLF);
-                                               rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE);
+                                               rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE, FALSE);
                                                break;
                                        default:
                                                msg_debug ("Ambigious command: '%s'", cmd);
                                                i = snprintf (out_buf, sizeof (out_buf), "Ambigious command" CRLF);
-                                               rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE);
+                                               rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE, FALSE);
                                                break;
                                }
                        }
@@ -435,7 +435,7 @@ controller_read_socket (f_str_t *in, void *arg)
                                session->state = STATE_REPLY;
                        }
                        if (session->state != STATE_LEARN) {
-                               rspamd_dispatcher_write (session->dispatcher, END, sizeof (END) - 1, FALSE);
+                               rspamd_dispatcher_write (session->dispatcher, END, sizeof (END) - 1, FALSE, TRUE);
                        }
 
                        g_strfreev (params);
@@ -449,7 +449,7 @@ controller_read_socket (f_str_t *in, void *arg)
                                if (!session->learn_tokenizer->tokenize_func (session->learn_tokenizer, 
                                                        session->session_pool, &c, &tokens)) {
                                        i = snprintf (out_buf, sizeof (out_buf), "learn fail, tokenizer error" CRLF);
-                                       rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE);
+                                       rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE, FALSE);
                                        session->state = STATE_REPLY;
                                        return;
                                }
@@ -459,7 +459,7 @@ controller_read_socket (f_str_t *in, void *arg)
                                                                                                        session->learn_filename, tokens, session->in_class);
                        session->worker->srv->stat->messages_learned ++;
                        i = snprintf (out_buf, sizeof (out_buf), "learn ok" CRLF);
-                       rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE);
+                       rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE, FALSE);
 
                        /* Clean learned parts */
                        while ((cur = g_list_first (session->parts))) {
@@ -541,7 +541,7 @@ accept_socket (int fd, short what, void *arg)
        new_session->dispatcher = rspamd_create_dispatcher (nfd, BUFFER_LINE, controller_read_socket,
                                                                                                                controller_write_socket, controller_err_socket, &io_tv,
                                                                                                                (void *)new_session);
-       rspamd_dispatcher_write (new_session->dispatcher, greetingbuf, strlen (greetingbuf), FALSE);
+       rspamd_dispatcher_write (new_session->dispatcher, greetingbuf, strlen (greetingbuf), FALSE, FALSE);
 }
 
 void
index 431083657828454bb49681bede563c56c36c62a5..d1928cf5ce3b726768fe09a0872d4e9d08e7cc65 100644 (file)
@@ -246,7 +246,7 @@ accept_socket (int fd, short what, void *arg)
        new_task->dispatcher = rspamd_create_dispatcher (nfd, BUFFER_LINE, lmtp_read_socket,
                                                                                                                lmtp_write_socket, lmtp_err_socket, &io_tv,
                                                                                                                (void *)lmtp);
-       rspamd_dispatcher_write (lmtp->task->dispatcher, greetingbuf, strlen (greetingbuf), FALSE);
+       rspamd_dispatcher_write (lmtp->task->dispatcher, greetingbuf, strlen (greetingbuf), FALSE, FALSE);
 }
 
 /*
index e6e09a825bd300fd2fbd6a1e2c92f18356368c24..69f343aaf13c2665fb5b9da627f1749e3c33fed9 100644 (file)
@@ -96,7 +96,7 @@ out_lmtp_reply (struct worker_task *task, int code, char *rcode, char *msg)
        else {
                r = snprintf (outbuf, OUTBUFSIZ, "%d %s %s\r\n", code, rcode, msg);
        }
-       rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+       rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, FALSE);
 }
 
 int 
@@ -337,7 +337,7 @@ mta_read_socket (f_str_t *in, void *arg)
                        else {
                                r = snprintf (outbuf, sizeof (outbuf), "HELO %s" CRLF, hostbuf); 
                        }
-                       rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE);
+                       rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE, FALSE);
                        cd->state = LMTP_WANT_MAIL;
                        break;
                case LMTP_WANT_MAIL:
@@ -347,7 +347,7 @@ mta_read_socket (f_str_t *in, void *arg)
                                return;
                        }
                        r = snprintf (outbuf, sizeof (outbuf), "MAIL FROM: <%s>" CRLF, cd->task->from);
-                       rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE);
+                       rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE, FALSE);
                        cd->state = LMTP_WANT_RCPT;
                        break;
                case LMTP_WANT_RCPT:
@@ -363,7 +363,7 @@ mta_read_socket (f_str_t *in, void *arg)
                                cur = g_list_next (cur);
                        }
 
-                       rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE);
+                       rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE, FALSE);
                        cd->state = LMTP_WANT_DATA;
                        break;
                case LMTP_WANT_DATA:
@@ -373,7 +373,7 @@ mta_read_socket (f_str_t *in, void *arg)
                                return;
                        }
                        r = snprintf (outbuf, sizeof (outbuf), "DATA" CRLF);
-                       rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE);
+                       rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE, FALSE);
                        cd->state = LMTP_WANT_DOT;
                        break;
                case LMTP_WANT_DOT:
@@ -384,10 +384,10 @@ mta_read_socket (f_str_t *in, void *arg)
                        }
                        c = g_mime_object_to_string ((GMimeObject *)cd->task->message);
                        r = strlen (c);
-                       rspamd_dispatcher_write (cd->task->dispatcher, c, r, TRUE);
-                       g_free (c);
+                       rspamd_dispatcher_write (cd->task->dispatcher, c, r, TRUE, TRUE);
+                       memory_pool_add_destructor (cd->task->task_pool, (pool_destruct_func)g_free, c);
                        r = snprintf (outbuf, sizeof (outbuf), CRLF "." CRLF);
-                       rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE);
+                       rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE, FALSE);
                        cd->state = LMTP_WANT_CLOSING;
                case LMTP_WANT_CLOSING:
                        if (!parse_mta_str (in, cd)) {
index 67a641ab516354d0d235232594b42955a1ebee66..0b7e35d84a4142660abdb5c40c37ef4b4c800f58 100644 (file)
@@ -192,7 +192,7 @@ emails_command_handler (struct worker_task *task)
        
        outbuf[r++] = '\r'; outbuf[r++] = '\n';
 
-       rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+       rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, FALSE);
        msg_info ("process_message: msg ok, id: <%s>, %d emails extracted", task->message_id, num);
 
        return 0;
index 093b67d88c3e3dd178b289c5cfd46a753d41ab32..a7ff5bb7a8ea5dc5c3f6ea7cd35ab467b08be8e8 100644 (file)
@@ -780,8 +780,8 @@ static int
 urls_command_handler (struct worker_task *task)
 {
        GList *cur;
-       char outbuf[16384], *urlstr;
-       int r, num = 0;
+       char *outbuf, *urlstr;
+       int r, num = 0, buflen;
        struct uri *url;
        GError *err = NULL;
        GTree *url_tree;
@@ -790,9 +790,22 @@ urls_command_handler (struct worker_task *task)
 
        url_tree = g_tree_new ((GCompareFunc)g_ascii_strcasecmp);
 
-       r = snprintf (outbuf, sizeof (outbuf), "%s 0 %s" CRLF, (task->proto == SPAMC_PROTO) ? SPAMD_REPLY_BANNER : RSPAMD_REPLY_BANNER, "OK");
+       /* First calculate buffer length */
+       cur = g_list_first (task->urls);
+       buflen = 0;
+       while (cur) {
+               url = cur->data;
+               buflen += strlen (struri (url)) + url->hostlen + sizeof (" <\"\">, ") - 1;      
+               cur = g_list_next (cur);
+       }
+
+       buflen += sizeof (RSPAMD_REPLY_BANNER " 0 OK" CRLF CRLF);
+
+       outbuf = memory_pool_alloc (task->task_pool, buflen * sizeof (char));
+
+       r = snprintf (outbuf, buflen, "%s 0 %s" CRLF, (task->proto == SPAMC_PROTO) ? SPAMD_REPLY_BANNER : RSPAMD_REPLY_BANNER, "OK");
        
-       r += snprintf (outbuf + r, sizeof (outbuf) - r - 2, "URLs: ");
+       r += snprintf (outbuf + r, buflen - r - 2, "URLs: ");
        
        cur = g_list_first (task->urls);
 
@@ -805,10 +818,10 @@ urls_command_handler (struct worker_task *task)
                        f.len = url->hostlen;
                        if ((urlstr = format_surbl_request (task->task_pool, &f, NULL, &host_end, FALSE, &err)) != NULL) {
                                if (g_list_next (cur) != NULL) {
-                                       r += snprintf (outbuf + r, sizeof (outbuf) - r - 2, "%s, ", (char *)urlstr);
+                                       r += snprintf (outbuf + r, buflen - r - 2, "%s <\"%s\">, ", (char *)urlstr, struri (url));
                                }
                                else {
-                                       r += snprintf (outbuf + r, sizeof (outbuf) - r - 2, "%s", (char *)urlstr);
+                                       r += snprintf (outbuf + r, buflen - r - 2, "%s <\"%s\">", (char *)urlstr, struri (url));
                                }
                        }
                }
@@ -817,7 +830,7 @@ urls_command_handler (struct worker_task *task)
        
        outbuf[r++] = '\r'; outbuf[r++] = '\n';
 
-       rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+       rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, TRUE);
        msg_info ("process_message: msg ok, id: <%s>, %d urls extracted", task->message_id, num);
        g_tree_destroy (url_tree);
 
index 43a7217656628535b3e9816b4f94e0c05ea2161b..5374487df6dfc9695d88925a809fcee283c4abbf 100644 (file)
@@ -396,7 +396,7 @@ show_url_header (struct worker_task *task)
                /* Do header folding */
                if (host.len + r >= OUTBUFSIZ - 3) {
                        outbuf[r ++] = '\r'; outbuf[r ++] = '\n'; outbuf[r] = ' ';
-                       rspamd_dispatcher_write (task->dispatcher, outbuf, r, TRUE);
+                       rspamd_dispatcher_write (task->dispatcher, outbuf, r, TRUE, FALSE);
                        r = 0;
                }
                /* Write url host to buf */
@@ -416,7 +416,7 @@ show_url_header (struct worker_task *task)
                }
                cur = g_list_next (cur);
        }
-       rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+       rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, FALSE);
 }
 
 static void
@@ -451,7 +451,7 @@ metric_symbols_callback (gpointer key, gpointer value, void *user_data)
        cd->log_offset += snprintf (cd->log_buf + cd->log_offset, cd->log_size - cd->log_offset,
                                                "%s,", (char *)key); 
 
-       rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+       rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, FALSE);
 }
 
 static void
@@ -474,7 +474,7 @@ show_metric_symbols (struct metric_result *metric_res, struct metric_callback_da
                        cur = g_list_next (cur);
                }
                g_list_free (symbols);
-               rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE);
+               rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE, FALSE);
        }
        else {
                g_hash_table_foreach (metric_res->symbols, metric_symbols_callback, cd);
@@ -534,7 +534,7 @@ show_metric_result (gpointer metric_name, gpointer metric_value, void *user_data
 #endif
        }
        else {
-               rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+               rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, FALSE);
 
                if (task->cmd == CMD_SYMBOLS && metric_value != NULL) {
                        show_metric_symbols (metric_res, cd);
@@ -553,7 +553,7 @@ write_check_reply (struct worker_task *task)
        struct metric_callback_data cd;
 
        r = snprintf (outbuf, sizeof (outbuf), "%s 0 %s" CRLF, (task->proto == SPAMC_PROTO) ? SPAMD_REPLY_BANNER : RSPAMD_REPLY_BANNER, "OK");
-       rspamd_dispatcher_write (task->dispatcher, outbuf, r, TRUE);
+       rspamd_dispatcher_write (task->dispatcher, outbuf, r, TRUE, FALSE);
 
        cd.task = task;
        cd.log_buf = logbuf;
@@ -589,7 +589,7 @@ write_check_reply (struct worker_task *task)
                show_url_header (task);
        }
        msg_info ("%s", logbuf);
-       rspamd_dispatcher_write (task->dispatcher, CRLF, sizeof (CRLF) - 1, FALSE);
+       rspamd_dispatcher_write (task->dispatcher, CRLF, sizeof (CRLF) - 1, FALSE, TRUE);
 
        return 0;
 }
@@ -642,10 +642,10 @@ write_process_reply (struct worker_task *task)
 
        outmsg = g_mime_object_to_string (GMIME_OBJECT (task->message));
 
-       rspamd_dispatcher_write (task->dispatcher, outbuf, r, TRUE);
-       rspamd_dispatcher_write (task->dispatcher, outmsg, strlen (outmsg), FALSE);
+       rspamd_dispatcher_write (task->dispatcher, outbuf, r, TRUE, FALSE);
+       rspamd_dispatcher_write (task->dispatcher, outmsg, strlen (outmsg), FALSE, TRUE);
 
-       g_free (outmsg);
+       memory_pool_add_destructor (task->task_pool, (pool_destruct_func)g_free, outmsg);
 
        return 0;
 }
@@ -669,7 +669,7 @@ write_reply (struct worker_task *task)
                        msg_debug ("write_reply: writing error: %s", outbuf);
                }
                /* Write to bufferevent error message */
-               rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+               rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, FALSE);
        }
        else {
                switch (task->cmd) {
@@ -685,11 +685,11 @@ write_reply (struct worker_task *task)
                        case CMD_SKIP:
                                r = snprintf (outbuf, sizeof (outbuf), "%s 0 %s" CRLF, (task->proto == SPAMC_PROTO) ? SPAMD_REPLY_BANNER : RSPAMD_REPLY_BANNER,
                                                                                                                                SPAMD_OK);
-                               rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+                               rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, FALSE);
                                break;
                        case CMD_PING:
                                r = snprintf (outbuf, sizeof (outbuf), "%s 0 PONG" CRLF, (task->proto == SPAMC_PROTO) ? SPAMD_REPLY_BANNER : RSPAMD_REPLY_BANNER);
-                               rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+                               rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, FALSE);
                                break;
                        case CMD_OTHER:
                                return task->custom_cmd->func (task);
index 7860f544a7145ea4606c7bfb175541fe06d7f226..c5ff469904203d9eb75204e9ff06120fb1d449a3 100644 (file)
--- a/src/url.h
+++ b/src/url.h
@@ -43,9 +43,6 @@ struct uri {
        /* Flags */
        unsigned int ipv6;      /* URI contains IPv6 host */
        unsigned int form;      /* URI originated from form */
-       
-       /* Link */
-       TAILQ_ENTRY(uri) next;
 };
 
 enum uri_errno {