]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Deal with `Connection` and `Host` headers on proxying 4802/head
authorVsevolod Stakhov <vsevolod@rspamd.com>
Mon, 29 Jan 2024 13:04:24 +0000 (13:04 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Mon, 29 Jan 2024 13:04:24 +0000 (13:04 +0000)
src/rspamd_proxy.c

index 838de060e63e98459cb018a882dcd8b2859e2a2e..191433aa41925145cb98d28419ee201a92ccd9f6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2023 Vsevolod Stakhov
+ * Copyright 2024 Vsevolod Stakhov
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -1443,6 +1443,14 @@ proxy_open_mirror_connections(struct rspamd_proxy_session *session)
                        continue;
                }
 
+               const char *up_name = rspamd_upstream_name(bk_conn->up);
+
+               if (up_name) {
+                       rspamd_http_message_remove_header(msg, "Host");
+                       rspamd_http_message_add_header(msg, "Host", up_name);
+               }
+               rspamd_http_message_add_header(msg, "Connection", "close");
+
                if (msg->url->len == 0) {
                        msg->url = rspamd_fstring_append(msg->url, "/check", strlen("/check"));
                }
@@ -1927,8 +1935,14 @@ proxy_send_master_message(struct rspamd_proxy_session *session)
                if (backend == NULL) {
                        backend = session->ctx->default_upstream;
                }
+
+               /* Remove the original Host header */
+               rspamd_http_message_remove_header(session->client_message, "Host");
        }
 
+       /* Remove the original `Connection` header */
+       rspamd_http_message_remove_header(session->client_message, "Connection");
+
        if (backend == NULL) {
                /* No backend */
                msg_err_session("cannot find upstream for %s", host ? hostbuf : "default");
@@ -2004,6 +2018,14 @@ proxy_send_master_message(struct rspamd_proxy_session *session)
                        goto err; /* No fallback here */
                }
 
+               /* Add new Host header */
+               const char *up_name = rspamd_upstream_name(session->master_conn->up);
+
+               if (up_name) {
+                       rspamd_http_message_add_header(msg, "Host", up_name);
+               }
+               rspamd_http_message_add_header(msg, "Connection", "close");
+
                session->master_conn->backend_conn = rspamd_http_connection_new_client_socket(
                        session->ctx->http_ctx,
                        NULL,