]> source.dussan.org Git - rspamd.git/commitdiff
Save input in rspamd client request.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 31 Jul 2015 15:26:14 +0000 (16:26 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 31 Jul 2015 15:26:14 +0000 (16:26 +0100)
src/client/rspamc.c
src/client/rspamdclient.c
src/client/rspamdclient.h

index 96be01b70eef8f015dbd8cc84c609c97d686209a..d6d0e1e2300a353304eefdc0e8d748c910579984 100644 (file)
@@ -783,7 +783,7 @@ rspamc_output_headers (struct rspamd_http_message *msg)
 static void
 rspamc_client_cb (struct rspamd_client_connection *conn,
        struct rspamd_http_message *msg,
-       const gchar *name, ucl_object_t *result,
+       const gchar *name, ucl_object_t *result, GString *input,
        gpointer ud, GError *err)
 {
        gchar *out;
index 3632792397361d91b43ceacb8ea16f42b3076d99..484a82089ba85b456f670d6ed8e804a786f67c6c 100644 (file)
@@ -53,6 +53,7 @@ struct rspamd_client_connection {
 struct rspamd_client_request {
        struct rspamd_client_connection *conn;
        struct rspamd_http_message *msg;
+       GString *input;
        rspamd_client_callback cb;
        gpointer ud;
 };
@@ -64,6 +65,21 @@ rspamd_client_error_quark (void)
        return g_quark_from_static_string ("rspamd-client-error");
 }
 
+static void
+rspamd_client_request_free (struct rspamd_client_request *req)
+{
+       if (req != NULL) {
+               if (req->conn) {
+                       req->conn->req = NULL;
+               }
+               if (req->input) {
+                       g_string_free (req->input, TRUE);
+               }
+
+               g_slice_free1 (sizeof (*req), req);
+       }
+}
+
 static gint
 rspamd_client_body_handler (struct rspamd_http_connection *conn,
        struct rspamd_http_message *msg,
@@ -81,7 +97,8 @@ rspamd_client_error_handler (struct rspamd_http_connection *conn, GError *err)
        struct rspamd_client_connection *c;
 
        c = req->conn;
-       req->cb (c, NULL, c->server_name->str, NULL, req->ud, err);
+       req->cb (c, NULL, c->server_name->str, NULL, req->input, req->ud, err);
+       rspamd_client_request_free (req);
 }
 
 static gint
@@ -111,8 +128,9 @@ rspamd_client_finish_handler (struct rspamd_http_connection *conn,
                        err = g_error_new (RCLIENT_ERROR, msg->code, "HTTP error: %d, %s",
                                        msg->code,
                                        msg->status ? msg->status->str : "unknown error");
-                       req->cb (c, msg, c->server_name->str, NULL, req->ud, err);
+                       req->cb (c, msg, c->server_name->str, NULL, req->input, req->ud, err);
                        g_error_free (err);
+                       rspamd_client_request_free (req);
                        return 0;
                }
 
@@ -121,14 +139,16 @@ rspamd_client_finish_handler (struct rspamd_http_connection *conn,
                        err = g_error_new (RCLIENT_ERROR, msg->code, "Cannot parse UCL: %s",
                                        ucl_parser_get_error (parser));
                        ucl_parser_free (parser);
-                       req->cb (c, msg, c->server_name->str, NULL, req->ud, err);
+                       req->cb (c, msg, c->server_name->str, NULL, req->input, req->ud, err);
                        g_error_free (err);
+                       rspamd_client_request_free (req);
                        return 0;
                }
 
                req->cb (c, msg, c->server_name->str, ucl_parser_get_object (
-                               parser), req->ud, NULL);
+                               parser), req->input, req->ud, NULL);
                ucl_parser_free (parser);
+               rspamd_client_request_free (req);
        }
 
        return 0;
@@ -190,8 +210,9 @@ rspamd_client_command (struct rspamd_client_connection *conn,
        gchar *p, *hn, *hv;
        gsize remain, old_len;
        GHashTableIter it;
+       GString *input = NULL;
 
-       req = g_slice_alloc (sizeof (struct rspamd_client_request));
+       req = g_slice_alloc0 (sizeof (struct rspamd_client_request));
        req->conn = conn;
        req->cb = cb;
        req->ud = ud;
@@ -203,31 +224,37 @@ rspamd_client_command (struct rspamd_client_connection *conn,
 
        if (in != NULL) {
                /* Read input stream */
-               req->msg->body = g_string_sized_new (BUFSIZ);
+               input = g_string_sized_new (BUFSIZ);
+
                while (!feof (in)) {
-                       p = req->msg->body->str + req->msg->body->len;
-                       remain = req->msg->body->allocated_len - req->msg->body->len - 1;
+                       p = input->str + input->len;
+                       remain = input->allocated_len - input->len - 1;
                        if (remain == 0) {
-                               old_len = req->msg->body->len;
-                               g_string_set_size (req->msg->body, old_len * 2);
-                               req->msg->body->len = old_len;
+                               old_len = input->len;
+                               g_string_set_size (input, old_len * 2);
+                               input->len = old_len;
                                continue;
                        }
                        remain = fread (p, 1, remain, in);
                        if (remain > 0) {
-                               req->msg->body->len += remain;
-                               req->msg->body->str[req->msg->body->len] = '\0';
+                               input->len += remain;
+                               input->str[input->len] = '\0';
                        }
                }
                if (ferror (in) != 0) {
                        g_set_error (err, RCLIENT_ERROR, ferror (
                                        in), "input IO error: %s", strerror (ferror (in)));
                        g_slice_free1 (sizeof (struct rspamd_client_request), req);
+                       g_string_free (input, TRUE);
                        return FALSE;
                }
+
+               req->msg->body = g_string_new_len (input->str, input->len);
+               req->input = input;
        }
        else {
                req->msg->body = NULL;
+               req->input = NULL;
        }
 
        /* Convert headers */
index badfaafb2c8bbfa3ee7affd4277d888d4b5d4bad..2a63b5a7fe2b3655d096c99a05ea9bd1923d7524 100644 (file)
@@ -43,6 +43,7 @@ typedef void (*rspamd_client_callback) (
        struct rspamd_http_message *msg,
        const gchar *name,
        ucl_object_t *result,
+       GString *input,
        gpointer ud,
        GError *err);