I need to send a specific host value to the client app when the admin server hits the actuator endpoint. For example, I would like to be able to make the following curl request via admin server.
curl -H "Host: discovery-headless" 10.0.10.2:9080/actuator/metrics
I tried adding the following HttpHeadersProvider
@Bean
public HttpHeadersProvider customHttpHeadersProvider() {
return (instance) -> {
HttpHeaders httpHeaders = new HttpHeaders();
String serviceName = instance.getRegistration().getName();
String host = serviceName.contains("headless") ? serviceName : serviceName + "-headless";
httpHeaders.add("Host", host);
return httpHeaders;
};
}
and I can see that the header is present in the request but the endpoints being registered also have headless in their urls.
endpoints=Endpoints(endpoints={caches=Endpoint(id=caches, url=http://discovery-headless/actuator/caches), loggers=Endpoint(id=loggers, url=http://discovery-headless/actuator/loggers), logfile=Endpoint(id=logfile, url=http://discovery-headless/actuator/logfile),
I also tried adding a filter to webclient without using HttpHeadersProvider but I am seeing the same result. The endpoints all have the overwritten host in their urls.
@Override
public void customize(Builder webClientBuilder) {
webClientBuilder.filter(addHeadlessHeader());
}
private ExchangeFilterFunction addHeadlessHeader() {
return (clientRequest, next) -> {
Map<String, String> updatedHeaders = new HashMap<>();
clientRequest.headers().forEach((key, values) -> {
for (String value : values) {
updatedHeaders.put(key, value);
}
});
String hostHeader = updatedHeaders.get(HttpHeaders.HOST);
if(hostHeader == null || (hostHeader != null && !hostHeader.contains("headless"))) {
Instance service = (Instance) clientRequest.attribute("instance").get();
if(service != null) {
String serviceName = service.getRegistration().getName();
hostHeader = serviceName + "-headless";
updatedHeaders.put(HttpHeaders.HOST, hostHeader);
}
}
ClientRequest updatedRequest = ClientRequest.from(clientRequest)
.headers(headers -> headers.setAll(updatedHeaders))
.build();
return next.exchange(updatedRequest);
};
}
What is the correct way to override the Host header when making a request to a client instance?