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

This commit is contained in:
James Moessis
2022-06-09 17:16:22 +10:00
committed by Marcin Grzejszczak
parent fe7d4f775f
commit aea19fcd11
2 changed files with 41 additions and 2 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,25 @@ 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;
@@ -32,9 +35,15 @@ import org.springframework.lang.Nullable;
* @since 5.10
*/
// Public for use in sparkjava or other frameworks that re-use servlet types
class HttpServletRequestWrapper implements HttpServerRequest {
public class HttpServletRequestWrapper implements HttpServerRequest {
/** @since 5.10 */
private static final List<String> COMBINABLE_HEADERS = Collections.singletonList("baggage");
/**
* Wraps the request in a tracing representation.
* @param request http request
* @return wrapped request
*/
public static HttpServerRequest create(HttpServletRequest request) {
return new HttpServletRequestWrapper(request);
}
@@ -86,6 +95,14 @@ 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);
}