From 5c7519aee79f1d845f495574896a8aa5081b580e Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 15 May 2019 11:17:09 +0200 Subject: [PATCH] Esnures that multivalue headers are propagated in the Gateway; fixes gh-1352 --- .../client/TraceRequestHttpHeadersFilter.java | 4 +-- .../TraceRequestHttpHeadersFilterTests.java | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilter.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilter.java index fcfb4a2c6..4408c148c 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilter.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilter.java @@ -57,8 +57,8 @@ final class TraceRequestHttpHeadersFilter extends AbstractHttpHeadersFilter { } exchange.getAttributes().put(SPAN_ATTRIBUTE, span); HttpHeaders headersWithInput = new HttpHeaders(); - headersWithInput.setAll(input.toSingleValueMap()); - headersWithInput.setAll(builder.build().getHeaders().toSingleValueMap()); + headersWithInput.addAll(input); + builder.build().getHeaders().forEach(headersWithInput::put); return headersWithInput; } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilterTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilterTests.java index 89de3e4c1..4917b4f4a 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilterTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilterTests.java @@ -16,6 +16,7 @@ package org.springframework.cloud.sleuth.instrument.web.client; +import java.util.Arrays; import java.util.Collections; import brave.Tracing; @@ -94,6 +95,30 @@ public class TraceRequestHttpHeadersFilterTests { .isNotNull(); } + // #1352 + @Test + public void should_set_tracing_headers_with_multiple_values() { + HttpHeadersFilter filter = TraceRequestHttpHeadersFilter.create(this.httpTracing); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.addAll("X-Hello", Arrays.asList("World1", "World2")); + MockServerHttpRequest request = MockServerHttpRequest.post("foo/bar") + .headers(httpHeaders).build(); + MockServerWebExchange exchange = MockServerWebExchange.builder(request).build(); + + HttpHeaders filteredHeaders = filter.filter(requestHeaders(), exchange); + + BDDAssertions.then(filteredHeaders.get("X-B3-TraceId")).isNotEmpty(); + BDDAssertions.then(filteredHeaders.get("X-B3-SpanId")).isNotEmpty(); + BDDAssertions.then(filteredHeaders.get("X-Hello")) + .isEqualTo(Arrays.asList("World1", "World2")); + BDDAssertions.then(filteredHeaders.get("X-Hello-Request")) + .isEqualTo(Collections.singletonList("Request World")); + BDDAssertions + .then((Object) exchange + .getAttribute(TraceRequestHttpHeadersFilter.SPAN_ATTRIBUTE)) + .isNotNull(); + } + private HttpHeaders requestHeaders() { HttpHeaders headers = new HttpHeaders(); headers.add("X-Hello-Request", "Request World");