]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Fix spamc support in rspamd proxy
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 19 May 2017 15:55:28 +0000 (16:55 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 20 May 2017 11:31:49 +0000 (12:31 +0100)
src/libserver/protocol.c
src/libserver/protocol.h
src/rspamd_proxy.c

index 4acf0202df6d34c27180e639d1925eeb6715b1b1..f322295e0c631554cb4f48e06044fdec61bd1961 100644 (file)
@@ -1000,7 +1000,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)
 {
index c0095fedca44950d96ded57191a4b68e76d3d8e0..40bae4003c1cdb8ee3e27d4546aef3c687cf9331 100644 (file)
@@ -109,4 +109,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
index 97215d7c425a8b763979d9120ac9b7157f7c9fb4..24da9187efa3ffe06d91b9acea12d74a9bcb3389 100644 (file)
@@ -144,6 +144,12 @@ struct rspamd_proxy_backend_connection {
        gint parser_to_ref;
 };
 
+enum rspamd_proxy_legacy_support {
+       LEGACY_SUPPORT_NO = 0,
+       LEGACY_SUPPORT_RSPAMC,
+       LEGACY_SUPPORT_SPAMC
+};
+
 struct rspamd_proxy_session {
        rspamd_mempool_t *pool;
        struct rspamd_proxy_ctx *ctx;
@@ -157,7 +163,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;
 };
@@ -1171,11 +1177,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;
                }
@@ -1338,7 +1352,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");
                }