Fix issue with copying headers in NativeMessageHeaderAccessor
Closes gh-25821
This commit is contained in:
parent
4b9c3fa739
commit
7ad60d385b
|
|
@ -75,8 +75,6 @@ public class NativeMessageHeaderAccessor extends MessageHeaderAccessor {
|
|||
@SuppressWarnings("unchecked")
|
||||
Map<String, List<String>> map = (Map<String, List<String>>) getHeader(NATIVE_HEADERS);
|
||||
if (map != null) {
|
||||
// Force removal since setHeader checks for equality
|
||||
removeHeader(NATIVE_HEADERS);
|
||||
setHeader(NATIVE_HEADERS, new LinkedMultiValueMap<>(map));
|
||||
}
|
||||
}
|
||||
|
|
@ -105,14 +103,40 @@ public class NativeMessageHeaderAccessor extends MessageHeaderAccessor {
|
|||
if (isMutable()) {
|
||||
Map<String, List<String>> map = getNativeHeaders();
|
||||
if (map != null) {
|
||||
// Force removal since setHeader checks for equality
|
||||
removeHeader(NATIVE_HEADERS);
|
||||
setHeader(NATIVE_HEADERS, Collections.unmodifiableMap(map));
|
||||
}
|
||||
super.setImmutable();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setHeader(String name, @Nullable Object value) {
|
||||
if (name.equalsIgnoreCase(NATIVE_HEADERS)) {
|
||||
// Force removal since setHeader checks for equality
|
||||
removeHeader(NATIVE_HEADERS);
|
||||
}
|
||||
super.setHeader(name, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public void copyHeaders(@Nullable Map<String, ?> headersToCopy) {
|
||||
if (headersToCopy != null) {
|
||||
Map<String, List<String>> nativeHeaders = getNativeHeaders();
|
||||
Map<String, List<String>> map = (Map<String, List<String>>) headersToCopy.get(NATIVE_HEADERS);
|
||||
if (map != null) {
|
||||
if (nativeHeaders != null) {
|
||||
nativeHeaders.putAll(map);
|
||||
}
|
||||
else {
|
||||
nativeHeaders = new LinkedMultiValueMap<>(map);
|
||||
}
|
||||
}
|
||||
super.copyHeaders(headersToCopy);
|
||||
setHeader(NATIVE_HEADERS, nativeHeaders);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the native header map contains the give header name.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -224,4 +224,21 @@ public class NativeMessageHeaderAccessorTests {
|
|||
headerAccessor.setImmutable();
|
||||
}
|
||||
|
||||
@Test // gh-25821
|
||||
void copyImmutableToMutable() {
|
||||
NativeMessageHeaderAccessor source = new NativeMessageHeaderAccessor();
|
||||
source.addNativeHeader("foo", "bar");
|
||||
Message<String> message = MessageBuilder.createMessage("payload", source.getMessageHeaders());
|
||||
|
||||
NativeMessageHeaderAccessor target = new NativeMessageHeaderAccessor();
|
||||
target.copyHeaders(message.getHeaders());
|
||||
target.setLeaveMutable(true);
|
||||
message = MessageBuilder.createMessage(message.getPayload(), target.getMessageHeaders());
|
||||
|
||||
MessageHeaderAccessor accessor = MessageHeaderAccessor.getMutableAccessor(message);
|
||||
assertThat(accessor.isMutable());
|
||||
((NativeMessageHeaderAccessor) accessor).addNativeHeader("foo", "baz");
|
||||
assertThat(((NativeMessageHeaderAccessor) accessor).getNativeHeader("foo")).containsExactly("bar", "baz");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue