Added a workaround for the mutability of native headers (#1323)
Since for some reason, the native headers sometimes are immutable even though the accessor says that the headers are mutable, then we have to ensure their * mutability. We do so by first making a mutable copy of the native headers, then by removing the native headers from the headers map and replacing them with a mutable copy fixes #1184
This commit is contained in:
committed by
GitHub
parent
18d535534e
commit
ab82f30623
@@ -83,7 +83,11 @@ enum MessageHeaderPropagation
|
||||
accessor.removeHeader(keyToRemove);
|
||||
if (accessor instanceof NativeMessageHeaderAccessor) {
|
||||
NativeMessageHeaderAccessor nativeAccessor = (NativeMessageHeaderAccessor) accessor;
|
||||
nativeAccessor.removeNativeHeader(keyToRemove);
|
||||
if (accessor.isMutable()) {
|
||||
// 1184 native headers can be an immutable map
|
||||
ensureNativeHeadersAreMutable(nativeAccessor)
|
||||
.removeNativeHeader(keyToRemove);
|
||||
}
|
||||
}
|
||||
else {
|
||||
Object nativeHeaders = accessor
|
||||
@@ -95,6 +99,26 @@ enum MessageHeaderPropagation
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Since for some reason, the native headers sometimes are immutable even though the
|
||||
* accessor says that the headers are mutable, then we have to ensure their
|
||||
* mutability. We do so by first making a mutable copy of the native headers, then by
|
||||
* removing the native headers from the headers map and replacing them with a mutable
|
||||
* copy. Workaround for #1184
|
||||
* @param nativeAccessor accessor containing (or not) native headers
|
||||
* @return modified accessor
|
||||
*/
|
||||
private static NativeMessageHeaderAccessor ensureNativeHeadersAreMutable(
|
||||
NativeMessageHeaderAccessor nativeAccessor) {
|
||||
Map<String, List<String>> nativeHeaderMap = nativeAccessor.toNativeHeaderMap();
|
||||
nativeHeaderMap = nativeHeaderMap instanceof LinkedMultiValueMap ? nativeHeaderMap
|
||||
: new LinkedMultiValueMap<>(nativeHeaderMap);
|
||||
nativeAccessor.removeHeader(NativeMessageHeaderAccessor.NATIVE_HEADERS);
|
||||
nativeAccessor.setHeader(NativeMessageHeaderAccessor.NATIVE_HEADERS,
|
||||
nativeHeaderMap);
|
||||
return nativeAccessor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void put(MessageHeaderAccessor accessor, String key, String value) {
|
||||
try {
|
||||
@@ -116,7 +140,7 @@ enum MessageHeaderPropagation
|
||||
accessor.setHeader(key, value);
|
||||
if (accessor instanceof NativeMessageHeaderAccessor) {
|
||||
NativeMessageHeaderAccessor nativeAccessor = (NativeMessageHeaderAccessor) accessor;
|
||||
nativeAccessor.setNativeHeader(key, value);
|
||||
ensureNativeHeadersAreMutable(nativeAccessor).setNativeHeader(key, value);
|
||||
}
|
||||
else {
|
||||
Object nativeHeaders = accessor
|
||||
|
||||
@@ -161,7 +161,8 @@ class HttpClientBeanPostProcessor implements BeanPostProcessor {
|
||||
AtomicReference reference = req.currentContext()
|
||||
.getOrDefault(AtomicReference.class, new AtomicReference());
|
||||
Span span = handler().handleSend(injector(), req.requestHeaders(), req,
|
||||
reference.get() == null ? handler().nextSpan(req) : (Span) reference.get());
|
||||
reference.get() == null ? handler().nextSpan(req)
|
||||
: (Span) reference.get());
|
||||
reference.set(span);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"-//Puppy Crawl//DTD Suppressions 1.1//EN"
|
||||
"https://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
|
||||
<suppressions>
|
||||
<suppress files=".*/test/.*" checks="JavadocVariable"/>
|
||||
<suppress files=".*FinishedSpanHandlerTests.*" checks="LineLengthCheck"/>
|
||||
<suppress files=".*GrpcTracingIntegrationTests.*" checks="LineLengthCheck"/>
|
||||
<suppress files=".*IgnoreAutoConfiguredSkipPatternsIntegrationTests.*" checks="LineLengthCheck"/>
|
||||
|
||||
Reference in New Issue
Block a user