Esnures that multivalue headers are propagated in the Gateway; fixes gh-1352

This commit is contained in:
Marcin Grzejszczak
2019-05-15 11:17:09 +02:00
parent 4f207059a7
commit 6ff6829c79
2 changed files with 27 additions and 2 deletions

View File

@@ -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;
}

View File

@@ -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");