From f731f6aa390bbff7acceea42a7d685c97863eed3 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 6 Aug 2018 18:31:53 +0200 Subject: [PATCH] Restore customization of HTTP trace request headers This commit restore the use of the `postProcessRequestHeaders` method when overridden in a custom HttpExchangeTracer implementation. Closes gh-13924 --- .../trace/http/HttpExchangeTracer.java | 7 +++-- .../trace/http/HttpExchangeTracerTests.java | 30 +++++++++++++++++++ .../asciidoc/production-ready-features.adoc | 3 +- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/trace/http/HttpExchangeTracer.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/trace/http/HttpExchangeTracer.java index 1873fd1e8ec..06bdf941680 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/trace/http/HttpExchangeTracer.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/trace/http/HttpExchangeTracer.java @@ -127,8 +127,11 @@ public class HttpExchangeTracer { @Override public Map> getHeaders() { - return getHeadersIfIncluded(Include.REQUEST_HEADERS, - this.delegate::getHeaders, this::includedHeader); + Map> headers = getHeadersIfIncluded( + Include.REQUEST_HEADERS, this.delegate::getHeaders, + this::includedHeader); + postProcessRequestHeaders(headers); + return headers; } private boolean includedHeader(String name) { diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/trace/http/HttpExchangeTracerTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/trace/http/HttpExchangeTracerTests.java index 87e653236ad..cd6ad114429 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/trace/http/HttpExchangeTracerTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/trace/http/HttpExchangeTracerTests.java @@ -29,6 +29,8 @@ import org.junit.Test; import org.springframework.boot.actuate.trace.http.HttpTrace.Request; import org.springframework.http.HttpHeaders; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; @@ -89,6 +91,19 @@ public class HttpExchangeTracerTests { assertThat(request.getHeaders()).containsOnlyKeys(HttpHeaders.ACCEPT); } + @Test + public void requestHeadersCanBeCustomized() { + MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add("to-remove", "test"); + headers.add("test", "value"); + HttpTrace trace = new RequestHeadersFilterHttpExchangeTracer() + .receivedRequest(createRequest(headers)); + Request request = trace.getRequest(); + assertThat(request.getHeaders()).containsOnlyKeys("test", "to-add"); + assertThat(request.getHeaders().get("test")).containsExactly("value"); + assertThat(request.getHeaders().get("to-add")).containsExactly("42"); + } + @Test public void authorizationHeaderIsNotIncludedByDefault() { HttpTrace trace = new HttpExchangeTracer(EnumSet.of(Include.REQUEST_HEADERS)) @@ -332,4 +347,19 @@ public class HttpExchangeTracerTests { return output.toString(); } + private static class RequestHeadersFilterHttpExchangeTracer + extends HttpExchangeTracer { + + RequestHeadersFilterHttpExchangeTracer() { + super(EnumSet.of(Include.REQUEST_HEADERS)); + } + + @Override + protected void postProcessRequestHeaders(Map> headers) { + headers.remove("to-remove"); + headers.putIfAbsent("to-add", Collections.singletonList("42")); + } + + } + } diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc index 3b5d52af271..b6e1d65a129 100644 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc +++ b/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc @@ -1915,7 +1915,8 @@ endpoint and obtain basic information about the last 100 request-response exchan [[production-ready-http-tracing-custom]] === Custom HTTP tracing To customize the items that are included in each trace, use the -`management.trace.http.include` configuration property. +`management.trace.http.include` configuration property. For advanced customization, +consider registering your own `HttpExchangeTracer` implementation. By default, an `InMemoryHttpTraceRepository` that stores traces for the last 100 request-response exchanges is used. If you need to expand the capacity, you can define