@@ -139,19 +139,49 @@ bypass_ok(HttpTransact::State *s)
139139 return false;
140140}
141141
142+ // wrapper to choose between a remap next hop strategy or use parent.config
143+ // remap next hop strategy is preferred
144+ inline static bool
145+ host_override(HttpTransact::State *s)
146+ {
147+ bool res = false;
148+ if (nullptr != s->next_hop_strategy) {
149+ // remap strategies do not support the TSHttpTxnParentProxySet API.
150+ res = s->next_hop_strategy->host_override;
151+ } else if (nullptr != s->parent_params) {
152+ res = s->parent_result.host_override();
153+ }
154+ return res;
155+ }
156+
157+ // wrapper to choose between a remap next hop strategy or use parent.config
158+ // remap next hop strategy is preferred
159+ inline static bool
160+ is_some(HttpTransact::State *s)
161+ {
162+ bool res = false;
163+ if (nullptr != s->next_hop_strategy) {
164+ // remap strategies do not support the TSHttpTxnParentProxySet API.
165+ res = s->parent_result.result == ParentResultType::SPECIFIED;
166+ } else if (nullptr != s->parent_params) {
167+ res = s->parent_result.is_some();
168+ }
169+ return res;
170+ }
171+
142172// wrapper to choose between a remap next hop strategy or use parent.config
143173// remap next hop strategy is preferred
144174inline static bool
145175is_api_result(HttpTransact::State *s)
146176{
147- bool r = false;
177+ bool res = false;
148178 if (nullptr != s->next_hop_strategy) {
149179 // remap strategies do not support the TSHttpTxnParentProxySet API.
150- r = false;
180+ res = false;
151181 } else if (nullptr != s->parent_params) {
152- r = s->parent_result.is_api_result();
182+ res = s->parent_result.is_api_result();
153183 }
154- return r ;
184+ return res ;
155185}
156186
157187// wrapper to get the max_retries.
@@ -207,6 +237,8 @@ retry_type(HttpTransact::State *s)
207237inline static void
208238findParent(HttpTransact::State *s)
209239{
240+ TxnDbg(dbg_ctl_http_trans, " findParent" );
241+
210242 Metrics::Counter::increment(http_rsb.parent_count);
211243 if (s->response_action.handled) {
212244 s->parent_result.hostname = s->response_action.action.hostname;
@@ -295,6 +327,8 @@ parentExists(HttpTransact::State *s)
295327inline static void
296328nextParent(HttpTransact::State *s)
297329{
330+ TxnDbg(dbg_ctl_http_trans, " nextParent" );
331+
298332 TxnDbg(dbg_ctl_parent_down, " connection to parent %s failed, conn_state: %s, request to origin: %s" , s->parent_result.hostname,
299333 HttpDebugNames::get_server_state_name(s->current.state), s->request_data.get_host());
300334 Metrics::Counter::increment(http_rsb.parent_count);
@@ -594,15 +628,19 @@ find_server_and_update_current_info(HttpTransact::State *s)
594628 TxnDbg(dbg_ctl_http_trans, " request is from localhost, so bypass parent" );
595629 s->parent_result.result = ParentResultType::DIRECT;
596630 } else if (s->method == HTTP_WKSIDX_CONNECT && s->http_config_param->disable_ssl_parenting) {
631+ /// BNO
632+
597633 if (s->parent_result.result == ParentResultType::SPECIFIED) {
598634 nextParent(s);
599635 } else {
600636 findParent(s);
601637 }
602- if (!s->parent_result.is_some() || is_api_result(s) || parent_is_proxy(s)) {
638+
639+ if (!is_some(s) || is_api_result(s) || parent_is_proxy(s)) {
603640 TxnDbg(dbg_ctl_http_trans, " request not cacheable, so bypass parent" );
604641 s->parent_result.result = ParentResultType::DIRECT;
605642 }
643+
606644 } else if (s->txn_conf->uncacheable_requests_bypass_parent && s->txn_conf->no_dns_forward_to_parent == 0 &&
607645 !HttpTransact::is_request_cache_lookupable(s)) {
608646 // request not lookupable and cacheable, so bypass parent if the parent is not an origin server.
@@ -616,10 +654,12 @@ find_server_and_update_current_info(HttpTransact::State *s)
616654 } else {
617655 findParent(s);
618656 }
619- if (!s->parent_result.is_some() || is_api_result(s) || parent_is_proxy(s)) {
657+
658+ if (!is_some(s) || is_api_result(s) || parent_is_proxy(s)) {
620659 TxnDbg(dbg_ctl_http_trans, " request not cacheable, so bypass parent" );
621660 s->parent_result.result = ParentResultType::DIRECT;
622661 }
662+
623663 } else {
624664 switch (s->parent_result.result) {
625665 case ParentResultType::UNDEFINED:
@@ -660,14 +700,29 @@ find_server_and_update_current_info(HttpTransact::State *s)
660700 }
661701
662702 switch (s->parent_result.result) {
663- case ParentResultType::SPECIFIED:
664- s->parent_info.name = s->arena.str_store(s->parent_result.hostname, strlen(s->parent_result.hostname));
703+ case ParentResultType::SPECIFIED: {
704+ char const *const hostname = s->parent_result.hostname;
705+ s->parent_info.name = s->arena.str_store(hostname, strlen(hostname));
706+
707+ // if host header override option enabled
708+ if (host_override(s)) {
709+ TxnDbg(dbg_ctl_http_trans, " overriding host header with parent %s" , hostname);
710+ if (!s->hdr_info.server_request.valid()) {
711+ s->hdr_info.client_request.value_set(static_cast<std::string_view>(MIME_FIELD_HOST), hostname);
712+ s->hdr_info.client_request.mark_target_dirty();
713+ } else {
714+ s->hdr_info.server_request.value_set(static_cast<std::string_view>(MIME_FIELD_HOST), hostname);
715+ s->hdr_info.server_request.mark_target_dirty();
716+ }
717+ }
718+
665719 update_current_info(&s->current, &s->parent_info, ResolveInfo::PARENT_PROXY, false);
666720 update_dns_info(&s->dns_info, &s->current);
667721 ink_assert(s->dns_info.looking_up == ResolveInfo::PARENT_PROXY);
668722 s->next_hop_scheme = URL_WKSIDX_HTTP;
669723
670724 return ResolveInfo::PARENT_PROXY;
725+ }
671726 case ParentResultType::FAIL:
672727 // No more parents - need to return an error message
673728 s->current.request_to = ResolveInfo::HOST_NONE;
0 commit comments