aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2017-05-19 16:55:28 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2017-05-19 16:55:28 +0100
commitb0274f052131b83aa326d1fae717d54dce8b7229 (patch)
tree7d89befe42a9f997653cd354e57add8695ad8f87 /src
parente72ca2d97d5c96ee5b9589e9a07782f276bb74b0 (diff)
downloadrspamd-b0274f052131b83aa326d1fae717d54dce8b7229.tar.gz
rspamd-b0274f052131b83aa326d1fae717d54dce8b7229.zip
[Fix] Fix spamc support in rspamd proxy
Diffstat (limited to 'src')
-rw-r--r--src/libserver/protocol.c2
-rw-r--r--src/libserver/protocol.h3
-rw-r--r--src/rspamd_proxy.c29
3 files changed, 29 insertions, 5 deletions
diff --git a/src/libserver/protocol.c b/src/libserver/protocol.c
index 7a9a74afa..1602ab76f 100644
--- a/src/libserver/protocol.c
+++ b/src/libserver/protocol.c
@@ -988,7 +988,7 @@ rspamd_ucl_torspamc_output (const ucl_object_t *top,
}
}
-static void
+void
rspamd_ucl_tospamc_output (const ucl_object_t *top,
rspamd_fstring_t **out)
{
diff --git a/src/libserver/protocol.h b/src/libserver/protocol.h
index 3b7dabc73..254c5fcd1 100644
--- a/src/libserver/protocol.h
+++ b/src/libserver/protocol.h
@@ -114,4 +114,7 @@ void rspamd_protocol_write_reply (struct rspamd_task *task);
void rspamd_ucl_torspamc_output (const ucl_object_t *top,
rspamd_fstring_t **out);
+void rspamd_ucl_tospamc_output (const ucl_object_t *top,
+ rspamd_fstring_t **out);
+
#endif
diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c
index e9858b0ba..2365eb9b6 100644
--- a/src/rspamd_proxy.c
+++ b/src/rspamd_proxy.c
@@ -156,6 +156,12 @@ struct rspamd_proxy_backend_connection {
struct rspamd_task *task;
};
+enum rspamd_proxy_legacy_support {
+ LEGACY_SUPPORT_NO = 0,
+ LEGACY_SUPPORT_RSPAMC,
+ LEGACY_SUPPORT_SPAMC
+};
+
struct rspamd_proxy_session {
struct rspamd_worker *worker;
rspamd_mempool_t *pool;
@@ -171,7 +177,7 @@ struct rspamd_proxy_session {
GPtrArray *mirror_conns;
gsize map_len;
gint client_sock;
- gboolean is_spamc;
+ enum rspamd_proxy_legacy_support legacy_support;
gint retries;
ref_entry_t ref;
};
@@ -1387,11 +1393,19 @@ proxy_backend_master_finish_handler (struct rspamd_http_connection *conn,
}
- if (session->is_spamc) {
+ if (session->legacy_support > LEGACY_SUPPORT_NO) {
/* We need to reformat ucl to fit with legacy spamc protocol */
if (bk_conn->results) {
reply = rspamd_fstring_new ();
- rspamd_ucl_torspamc_output (bk_conn->results, &reply);
+
+ if (session->legacy_support == LEGACY_SUPPORT_SPAMC) {
+ rspamd_ucl_tospamc_output (bk_conn->results, &reply);
+ msg->flags |= RSPAMD_HTTP_FLAG_SPAMC;
+ }
+ else {
+ rspamd_ucl_torspamc_output (bk_conn->results, &reply);
+ }
+
rspamd_http_message_set_body_from_fstring_steal (msg, reply);
msg->method = HTTP_SYMBOLS;
}
@@ -1736,7 +1750,14 @@ proxy_client_finish_handler (struct rspamd_http_connection *conn,
/* Reset spamc legacy */
if (msg->method >= HTTP_SYMBOLS) {
msg->method = HTTP_GET;
- session->is_spamc = TRUE;
+
+ if (msg->flags & RSPAMD_HTTP_FLAG_SPAMC) {
+ session->legacy_support = LEGACY_SUPPORT_SPAMC;
+ }
+ else {
+ session->legacy_support = LEGACY_SUPPORT_SPAMC;
+ }
+
msg_info_session ("enabling legacy rspamc mode for session");
}