From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 16:17:50 +0000 (+0100) Subject: [Feature] Implement reading of messages to shared memory X-Git-Tag: 1.3.0~377 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4afabcbbe22e95a3dfe5db4b31b3b978f73fa0db;p=thirdparty%2Frspamd.git [Feature] Implement reading of messages to shared memory --- diff --git a/src/libutil/http.c b/src/libutil/http.c index bff41d0c91..cedf394ae6 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -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); diff --git a/src/libutil/http.h b/src/libutil/http.h index ab71f619b9..1e4ffbbc02 100644 --- a/src/libutil/http.h +++ b/src/libutil/http.h @@ -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 diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c index 1ab3a6fbc7..9d70306e9f 100644 --- a/src/rspamd_proxy.c +++ b/src/rspamd_proxy.c @@ -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,