commit 707357d: [Rework] Include SSL flag into keepalive hash
Vsevolod Stakhov
vsevolod at highsecure.ru
Wed Dec 8 11:49:04 UTC 2021
Author: Vsevolod Stakhov
Date: 2021-12-08 10:49:29 +0000
URL: https://github.com/rspamd/rspamd/commit/707357d35e12ee833f358418f380b685100e70b9
[Rework] Include SSL flag into keepalive hash
---
src/libserver/http/http_connection.c | 4 ++--
src/libserver/http/http_connection.h | 2 +-
src/libserver/http/http_context.c | 44 ++++++++++++++++++++++++------------
src/libserver/http/http_context.h | 12 ++++------
src/libserver/http/http_private.h | 1 +
5 files changed, 39 insertions(+), 24 deletions(-)
diff --git a/src/libserver/http/http_connection.c b/src/libserver/http/http_connection.c
index 0a5dee754..478e00984 100644
--- a/src/libserver/http/http_connection.c
+++ b/src/libserver/http/http_connection.c
@@ -1255,7 +1255,7 @@ rspamd_http_connection_new_keepalive (struct rspamd_http_context *ctx,
ctx = rspamd_http_context_default ();
}
- conn = rspamd_http_context_check_keepalive (ctx, addr, host);
+ conn = rspamd_http_context_check_keepalive(ctx, addr, host, false);
if (conn) {
return conn;
@@ -1267,7 +1267,7 @@ rspamd_http_connection_new_keepalive (struct rspamd_http_context *ctx,
addr);
if (conn) {
- rspamd_http_context_prepare_keepalive (ctx, conn, addr, host);
+ rspamd_http_context_prepare_keepalive(ctx, conn, addr, host, );
}
return conn;
diff --git a/src/libserver/http/http_connection.h b/src/libserver/http/http_connection.h
index 896f83c20..cc7c8a8f1 100644
--- a/src/libserver/http/http_connection.h
+++ b/src/libserver/http/http_connection.h
@@ -68,7 +68,7 @@ struct rspamd_storage_shmem {
*/
#define RSPAMD_HTTP_FLAG_SHMEM_IMMUTABLE (1 << 3)
/**
- * Use tls for this message
+ * Use tls for this message (how the fuck SSL flag could be used PER MESSAGE???)
*/
#define RSPAMD_HTTP_FLAG_SSL (1 << 4)
/**
diff --git a/src/libserver/http/http_context.c b/src/libserver/http/http_context.c
index 75bfbf2cf..b56f1c4c0 100644
--- a/src/libserver/http/http_context.c
+++ b/src/libserver/http/http_context.c
@@ -365,21 +365,29 @@ rspamd_http_context_default (void)
gint32
rspamd_keep_alive_key_hash (struct rspamd_keepalive_hash_key *k)
{
- gint32 h;
+ guint32 h;
h = rspamd_inet_address_port_hash (k->addr);
if (k->host) {
- h = rspamd_cryptobox_fast_hash (k->host, strlen (k->host), h);
+ h ^= rspamd_cryptobox_fast_hash (k->host, strlen (k->host), h);
}
- return h;
+ if (k->is_ssl) {
+ h = ~h;
+ }
+
+ return (gint32)h;
}
bool
rspamd_keep_alive_key_equal (struct rspamd_keepalive_hash_key *k1,
struct rspamd_keepalive_hash_key *k2)
{
+ if (k1->is_ssl != k2->is_ssl) {
+ return false;
+ }
+
if (k1->host && k2->host) {
if (rspamd_inet_address_port_equal (k1->addr, k2->addr)) {
return strcmp (k1->host, k2->host) == 0;
@@ -393,16 +401,18 @@ rspamd_keep_alive_key_equal (struct rspamd_keepalive_hash_key *k1,
return false;
}
-struct rspamd_http_connection*
-rspamd_http_context_check_keepalive (struct rspamd_http_context *ctx,
- const rspamd_inet_addr_t *addr,
- const gchar *host)
+struct rspamd_http_connection *
+rspamd_http_context_check_keepalive(struct rspamd_http_context *ctx,
+ const rspamd_inet_addr_t *addr,
+ const gchar *host,
+ bool is_ssl)
{
struct rspamd_keepalive_hash_key hk, *phk;
khiter_t k;
hk.addr = (rspamd_inet_addr_t *)addr;
hk.host = (gchar *)host;
+ hk.is_ssl = is_ssl;
k = kh_get (rspamd_keep_alive_hash, ctx->keep_alive_hash, &hk);
@@ -430,20 +440,23 @@ rspamd_http_context_check_keepalive (struct rspamd_http_context *ctx,
if (err != 0) {
rspamd_http_connection_unref (conn);
- msg_debug_http_context ("invalid reused keepalive element %s (%s); "
+ msg_debug_http_context ("invalid reused keepalive element %s (%s, ssl=%b); "
"%s error; "
"%d connections queued",
rspamd_inet_address_to_string_pretty (phk->addr),
phk->host,
+ phk->is_ssl,
g_strerror (err),
conns->length);
return NULL;
}
- msg_debug_http_context ("reused keepalive element %s (%s), %d connections queued",
+ msg_debug_http_context ("reused keepalive element %s (%s, ssl=%b), %d connections queued",
rspamd_inet_address_to_string_pretty (phk->addr),
- phk->host, conns->length);
+ phk->host,
+ phk->is_ssl,
+ conns->length);
/* We transfer refcount here! */
return conn;
@@ -459,16 +472,18 @@ rspamd_http_context_check_keepalive (struct rspamd_http_context *ctx,
}
void
-rspamd_http_context_prepare_keepalive (struct rspamd_http_context *ctx,
- struct rspamd_http_connection *conn,
- const rspamd_inet_addr_t *addr,
- const gchar *host)
+rspamd_http_context_prepare_keepalive(struct rspamd_http_context *ctx,
+ struct rspamd_http_connection *conn,
+ const rspamd_inet_addr_t *addr,
+ const gchar *host,
+ bool is_ssl)
{
struct rspamd_keepalive_hash_key hk, *phk;
khiter_t k;
hk.addr = (rspamd_inet_addr_t *)addr;
hk.host = (gchar *)host;
+ hk.is_ssl = is_ssl;
k = kh_get (rspamd_keep_alive_hash, ctx->keep_alive_hash, &hk);
@@ -487,6 +502,7 @@ rspamd_http_context_prepare_keepalive (struct rspamd_http_context *ctx,
phk = g_malloc (sizeof (*phk));
phk->conns = empty_init;
phk->host = g_strdup (host);
+ phk->is_ssl = is_ssl;
phk->addr = rspamd_inet_address_copy (addr);
kh_put (rspamd_keep_alive_hash, ctx->keep_alive_hash, phk, &r);
diff --git a/src/libserver/http/http_context.h b/src/libserver/http/http_context.h
index 82ee400b0..f42164dba 100644
--- a/src/libserver/http/http_context.h
+++ b/src/libserver/http/http_context.h
@@ -74,9 +74,9 @@ struct rspamd_http_context *rspamd_http_context_default (void);
* @param host
* @return
*/
-struct rspamd_http_connection *rspamd_http_context_check_keepalive (
- struct rspamd_http_context *ctx, const rspamd_inet_addr_t *addr,
- const gchar *host);
+struct rspamd_http_connection *
+rspamd_http_context_check_keepalive(struct rspamd_http_context *ctx, const rspamd_inet_addr_t *addr, const gchar *host,
+ bool is_ssl);
/**
* Prepares keepalive key for a connection by creating a new entry or by reusing existent
@@ -86,10 +86,8 @@ struct rspamd_http_connection *rspamd_http_context_check_keepalive (
* @param addr
* @param host
*/
-void rspamd_http_context_prepare_keepalive (struct rspamd_http_context *ctx,
- struct rspamd_http_connection *conn,
- const rspamd_inet_addr_t *addr,
- const gchar *host);
+void rspamd_http_context_prepare_keepalive(struct rspamd_http_context *ctx, struct rspamd_http_connection *conn,
+ const rspamd_inet_addr_t *addr, const gchar *host, bool is_ssl);
/**
* Pushes a connection to keepalive pool after client request is finished,
diff --git a/src/libserver/http/http_private.h b/src/libserver/http/http_private.h
index f2270277b..6306d197b 100644
--- a/src/libserver/http/http_private.h
+++ b/src/libserver/http/http_private.h
@@ -86,6 +86,7 @@ struct rspamd_http_message {
struct rspamd_keepalive_hash_key {
rspamd_inet_addr_t *addr;
gchar *host;
+ bool is_ssl;
GQueue conns;
};
More information about the Commits
mailing list