You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gs...@apache.org on 2020/12/17 16:30:11 UTC

[qpid-dispatch] branch master updated: DISPATCH-1887: host override option

This is an automated email from the ASF dual-hosted git repository.

gsim pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git


The following commit(s) were added to refs/heads/master by this push:
     new ebcd9f0  DISPATCH-1887: host override option
ebcd9f0 is described below

commit ebcd9f0d23a1d3fc5fd4ca79c20771048c3cd3c5
Author: Gordon Sim <gs...@redhat.com>
AuthorDate: Wed Dec 16 21:47:22 2020 +0000

    DISPATCH-1887: host override option
---
 python/qpid_dispatch/management/qdrouter.json |  6 ++++++
 src/adaptors/http1/http1_adaptor.c            |  1 +
 src/adaptors/http1/http1_private.h            |  1 +
 src/adaptors/http1/http1_server.c             | 19 +++++++++++++++++--
 src/adaptors/http_common.c                    |  2 ++
 src/adaptors/http_common.h                    |  1 +
 6 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/python/qpid_dispatch/management/qdrouter.json b/python/qpid_dispatch/management/qdrouter.json
index 0efab69..89a35a2 100644
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@ -1195,6 +1195,12 @@
                     "required": false,
                     "description": "Enables restricted event mode where no reponses are sent to request and only post is allowed",
                     "create": true
+                },
+                "hostOverride": {
+                    "type": "string",
+                    "required": false,
+                    "description": "Used to override the value of the Host header sent to the client.",
+                    "create": true
                 }
             }
         },
diff --git a/src/adaptors/http1/http1_adaptor.c b/src/adaptors/http1/http1_adaptor.c
index 931d268..6ce1ead 100644
--- a/src/adaptors/http1/http1_adaptor.c
+++ b/src/adaptors/http1/http1_adaptor.c
@@ -123,6 +123,7 @@ void qdr_http1_connection_free(qdr_http1_connection_t *hconn)
         free(hconn->cfg.port);
         free(hconn->cfg.address);
         free(hconn->cfg.site);
+        free(hconn->cfg.host_override);
         free(hconn->cfg.host_port);
 
         free(hconn->client.client_ip_addr);
diff --git a/src/adaptors/http1/http1_private.h b/src/adaptors/http1/http1_private.h
index 59074d1..858efb5 100644
--- a/src/adaptors/http1/http1_private.h
+++ b/src/adaptors/http1/http1_private.h
@@ -142,6 +142,7 @@ struct qdr_http1_connection_t {
         char *host_port;
         bool event_channel;
         qd_http_aggregation_t aggregation;
+        char *host_override;
     } cfg;
 
     // State if connected to an HTTP client
diff --git a/src/adaptors/http1/http1_server.c b/src/adaptors/http1/http1_server.c
index a0837bf..706c1e3 100644
--- a/src/adaptors/http1/http1_server.c
+++ b/src/adaptors/http1/http1_server.c
@@ -54,6 +54,7 @@ ALLOC_DECLARE(_server_response_msg_t);
 ALLOC_DEFINE(_server_response_msg_t);
 DEQ_DECLARE(_server_response_msg_t, _server_response_msg_list_t);
 
+const char *HOST_KEY = "Host";
 
 //
 // State for an HTTP/1.x Request+Response exchange, server facing
@@ -157,6 +158,7 @@ static qdr_http1_connection_t *_create_server_connection(qd_http_connector_t *ct
     ctor->ctx = (void*)hconn;
     hconn->cfg.event_channel = bconfig->event_channel;
     hconn->cfg.aggregation = bconfig->aggregation;
+    hconn->cfg.host_override = bconfig->host_override ? qd_strdup(bconfig->host_override) : 0;
 
     // for initiating a connection to the server
     hconn->server.reconnect_timer = qd_timer(qdr_http1_adaptor->core->qd, _do_reconnect, hconn);
@@ -1280,8 +1282,20 @@ static uint64_t _send_request_headers(_server_request_t *hreq, qd_message_t *msg
         if (!i_key)
             break;
 
-        // ignore the special headers added by the mapping
-        if (!qd_iterator_prefix(i_key, HTTP1_HEADER_PREFIX)) {
+        if (hconn->cfg.host_override && qd_iterator_equal(i_key, (const unsigned char*) HOST_KEY)) {
+            //if host override option is in use, write the configured
+            //value rather than that submitted by client
+            char *header_key = (char*) qd_iterator_copy(i_key);
+            qd_log(qdr_http1_adaptor->log, QD_LOG_TRACE,
+                   "[C%"PRIu64"][L%"PRIu64"] Encoding request header %s:%s",
+                   hconn->conn_id, hconn->out_link_id,
+                   header_key, hconn->cfg.host_override);
+
+            ok = !h1_codec_tx_add_header(hreq->base.lib_rs, header_key, hconn->cfg.host_override);
+
+            free(header_key);
+        } else if (!qd_iterator_prefix(i_key, HTTP1_HEADER_PREFIX)) {
+            // ignore the special headers added by the mapping
             qd_iterator_t *i_value = qd_parse_raw(value);
             if (!i_value)
                 break;
@@ -1300,6 +1314,7 @@ static uint64_t _send_request_headers(_server_request_t *hreq, qd_message_t *msg
             free(header_value);
         }
 
+
         key = qd_field_next_child(value);
     }
 
diff --git a/src/adaptors/http_common.c b/src/adaptors/http_common.c
index fc15c33..13673be 100644
--- a/src/adaptors/http_common.c
+++ b/src/adaptors/http_common.c
@@ -46,6 +46,7 @@ static qd_error_t load_bridge_config(qd_dispatch_t *qd, qd_http_bridge_config_t
     version_str     = qd_entity_get_string(entity, "protocolVersion");  CHECK();
     aggregation_str = qd_entity_opt_string(entity, "aggregation", 0);  CHECK();
     config->event_channel = qd_entity_opt_bool(entity, "eventChannel", false); CHECK();
+    config->host_override  = qd_entity_opt_string(entity, "hostOverride", 0);   CHECK();
 
     if (strcmp(version_str, "HTTP2") == 0) {
         config->version = VERSION_HTTP2;
@@ -88,6 +89,7 @@ void qd_http_free_bridge_config(qd_http_bridge_config_t *config)
     free(config->name);
     free(config->address);
     free(config->site);
+    free(config->host_override);
     free(config->host_port);
 }
 
diff --git a/src/adaptors/http_common.h b/src/adaptors/http_common.h
index 4d2ab96..441e6cf 100644
--- a/src/adaptors/http_common.h
+++ b/src/adaptors/http_common.h
@@ -46,6 +46,7 @@ typedef struct qd_http_bridge_config_t {
     char              *port;
     char              *address;
     char              *site;
+    char              *host_override;
     char              *host_port;
     qd_http_version_t  version;
     bool                  event_channel;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org