Fixes #2156 (Multiple baggage headers) (#2177)

This commit is contained in:
James Moessis
2022-06-09 17:16:22 +10:00
committed by GitHub
parent 40a4841b05
commit 4d8e82967d
2 changed files with 38 additions and 0 deletions

View File

@@ -29,6 +29,9 @@ import brave.propagation.TraceContextOrSamplingFlags;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.cloud.sleuth.instrument.web.servlet.HttpServletRequestWrapper;
import org.springframework.mock.web.MockHttpServletRequest;
import static java.util.Collections.singletonMap;
import static org.assertj.core.api.Assertions.assertThat;
@@ -106,6 +109,28 @@ class W3CBaggagePropagatorTest {
assertThat(baggageEntries).hasSize(1).containsEntry("key", "value2");
}
/**
* We need to use {@link HttpServletRequestWrapper} for the carrier for this test, since it is what combines the
* multiple baggage headers into one.
*/
@Test
void extract_multipleBaggageHeaders() {
MockHttpServletRequest mockRequest = new MockHttpServletRequest();
mockRequest.addHeader("baggage", "key1=value1;othermetadata");
mockRequest.addHeader("baggage", "key2=value2,key3=value3");
HttpServletRequestWrapper carrier = (HttpServletRequestWrapper) HttpServletRequestWrapper.create(mockRequest);
TraceContextOrSamplingFlags contextWithBaggage = propagator
.contextWithBaggage(carrier, context(), HttpServletRequestWrapper::header);
Map<String, String> baggageEntries = BaggageField.getAllValues(contextWithBaggage);
assertThat(baggageEntries)
.hasSize(3)
.containsEntry("key1", "value1")
.containsEntry("key2", "value2")
.containsEntry("key3", "value3");
}
@Test
void extract_fullComplexities() {
TraceContextOrSamplingFlags context = context();

View File

@@ -18,6 +18,9 @@ package org.springframework.cloud.sleuth.instrument.web.servlet;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
@@ -33,6 +36,8 @@ import org.springframework.lang.Nullable;
*/
public class HttpServletRequestWrapper implements HttpServerRequest {
private static final List<String> COMBINABLE_HEADERS = Collections.singletonList("baggage");
/**
* Wraps the request in a tracing representation.
* @param request http request
@@ -89,6 +94,14 @@ public class HttpServletRequestWrapper implements HttpServerRequest {
@Override
public String header(String name) {
if (COMBINABLE_HEADERS.contains(name)) {
LinkedList<String> headersList = new LinkedList<>();
Enumeration<String> headers = delegate.getHeaders(name);
while (headers.hasMoreElements()) {
headersList.add(headers.nextElement());
}
return headersList.size() != 0 ? String.join(",", headersList) : null;
}
return delegate.getHeader(name);
}