]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Feature] Implement reading of messages to shared memory
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 10 Jun 2016 16:17:50 +0000 (17:17 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 10 Jun 2016 16:17:50 +0000 (17:17 +0100)
src/libutil/http.c
src/libutil/http.h
src/rspamd_proxy.c

index bff41d0c9191b4c987d56b8ea5dc8490fc8a1b17..cedf394ae6ef4c00a12f8c5d7563593626d84508 100644 (file)
@@ -1306,9 +1306,10 @@ rspamd_http_connection_free (struct rspamd_http_connection *conn)
        g_slice_free1 (sizeof (struct rspamd_http_connection),             conn);
 }
 
-void
-rspamd_http_connection_read_message (struct rspamd_http_connection *conn,
-       gpointer ud, gint fd, struct timeval *timeout, struct event_base *base)
+static void
+rspamd_http_connection_read_message_common (struct rspamd_http_connection *conn,
+               gpointer ud, gint fd, struct timeval *timeout, struct event_base *base,
+               gint flags)
 {
        struct rspamd_http_connection_private *priv = conn->priv;
        struct rspamd_http_message *req;
@@ -1318,6 +1319,7 @@ rspamd_http_connection_read_message (struct rspamd_http_connection *conn,
        req = rspamd_http_new_message (
                conn->type == RSPAMD_HTTP_SERVER ? HTTP_REQUEST : HTTP_RESPONSE);
        priv->msg = req;
+       req->flags = flags;
 
        if (priv->peer_key) {
                priv->msg->peer_key = priv->peer_key;
@@ -1352,6 +1354,21 @@ rspamd_http_connection_read_message (struct rspamd_http_connection *conn,
        event_add (&priv->ev, priv->ptv);
 }
 
+void
+rspamd_http_connection_read_message (struct rspamd_http_connection *conn,
+               gpointer ud, gint fd, struct timeval *timeout, struct event_base *base)
+{
+       rspamd_http_connection_read_message_common (conn, ud, fd, timeout, base, 0);
+}
+
+void
+rspamd_http_connection_read_message_shared (struct rspamd_http_connection *conn,
+               gpointer ud, gint fd, struct timeval *timeout, struct event_base *base)
+{
+       rspamd_http_connection_read_message_common (conn, ud, fd, timeout, base,
+                       RSPAMD_HTTP_FLAG_SHMEM);
+}
+
 static void
 rspamd_http_connection_encrypt_message (
                struct rspamd_http_connection *conn,
@@ -1455,10 +1472,19 @@ rspamd_http_connection_encrypt_message (
        g_free (segments);
 }
 
+static void
+rspamd_http_detach_shared (struct rspamd_http_message *msg)
+{
+       rspamd_fstring_t *cpy_str;
+
+       cpy_str = rspamd_fstring_new_init (msg->body_buf.begin, msg->body_buf.len);
+       rspamd_http_message_set_body_from_fstring_steal (msg, cpy_str);
+}
+
 void
 rspamd_http_connection_write_message (struct rspamd_http_connection *conn,
-       struct rspamd_http_message *msg, const gchar *host, const gchar *mime_type,
-       gpointer ud, gint fd, struct timeval *timeout, struct event_base *base)
+               struct rspamd_http_message *msg, const gchar *host, const gchar *mime_type,
+               gpointer ud, gint fd, struct timeval *timeout, struct event_base *base)
 {
        struct rspamd_http_connection_private *priv = conn->priv;
        struct rspamd_http_header *hdr, *htmp;
@@ -1505,6 +1531,12 @@ rspamd_http_connection_write_message (struct rspamd_http_connection *conn,
                }
        }
 
+       if (encrypted && (msg->flags &
+                       (RSPAMD_HTTP_FLAG_SHMEM_IMMUTABLE|RSPAMD_HTTP_FLAG_SHMEM))) {
+               /* We cannot use immutable body to encrypt message in place */
+               rspamd_http_detach_shared (msg);
+       }
+
        if (encrypted) {
                mode = rspamd_keypair_alg (priv->local_key);
 
index ab71f619b9937d6e694e0d555467900c06074781..1e4ffbbc02cc11835474d502b88ba936ae577bca 100644 (file)
@@ -166,11 +166,18 @@ gboolean rspamd_http_connection_is_encrypted (struct rspamd_http_connection *con
  * @param fd fd to read/write
  */
 void rspamd_http_connection_read_message (
-       struct rspamd_http_connection *conn,
-       gpointer ud,
-       gint fd,
-       struct timeval *timeout,
-       struct event_base *base);
+               struct rspamd_http_connection *conn,
+               gpointer ud,
+               gint fd,
+               struct timeval *timeout,
+               struct event_base *base);
+
+void rspamd_http_connection_read_message_shared (
+               struct rspamd_http_connection *conn,
+               gpointer ud,
+               gint fd,
+               struct timeval *timeout,
+               struct event_base *base);
 
 /**
  * Send reply using initialised connection
@@ -180,14 +187,14 @@ void rspamd_http_connection_read_message (
  * @param fd fd to read/write
  */
 void rspamd_http_connection_write_message (
-       struct rspamd_http_connection *conn,
-       struct rspamd_http_message *msg,
-       const gchar *host,
-       const gchar *mime_type,
-       gpointer ud,
-       gint fd,
-       struct timeval *timeout,
-       struct event_base *base);
+               struct rspamd_http_connection *conn,
+               struct rspamd_http_message *msg,
+               const gchar *host,
+               const gchar *mime_type,
+               gpointer ud,
+               gint fd,
+               struct timeval *timeout,
+               struct event_base *base);
 
 /**
  * Free connection structure
index 1ab3a6fbc7f7421f8d1c163526046cc834341a13..9d70306e9f6953ad9a105fb97858c60dea351630 100644 (file)
@@ -1284,7 +1284,7 @@ proxy_accept_socket (gint fd, short what, void *arg)
                        rspamd_inet_address_to_string (addr),
                        rspamd_inet_address_get_port (addr));
 
-       rspamd_http_connection_read_message (session->client_conn,
+       rspamd_http_connection_read_message_shared (session->client_conn,
                        session,
                        nfd,
                        &ctx->io_tv,