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