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 <g...@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-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org