Browse Source

Fix Map.put contract for HeadersAdapter impl.

This commit fixes the `Map.put` contract for both Reactor Netty and
Tomcat specific `HeadersAdapter` implementations.

Issue: SPR-17415
pull/1999/head
Brian Clozel 8 years ago
parent
commit
85262a7932
  1. 2
      spring-web/src/main/java/org/springframework/http/server/reactive/NettyHeadersAdapter.java
  2. 1
      spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHeadersAdapter.java
  3. 17
      spring-web/src/test/java/org/springframework/http/server/reactive/HeadersAdaptersTests.java

2
spring-web/src/main/java/org/springframework/http/server/reactive/NettyHeadersAdapter.java

@ -124,7 +124,7 @@ class NettyHeadersAdapter implements MultiValueMap<String, String> { @@ -124,7 +124,7 @@ class NettyHeadersAdapter implements MultiValueMap<String, String> {
@Override
public List<String> put(String key, @Nullable List<String> value) {
List<String> previousValues = this.headers.getAll(key);
this.headers.add(key, value);
this.headers.set(key, value);
return previousValues;
}

1
spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHeadersAdapter.java

@ -138,6 +138,7 @@ class TomcatHeadersAdapter implements MultiValueMap<String, String> { @@ -138,6 +138,7 @@ class TomcatHeadersAdapter implements MultiValueMap<String, String> {
@Nullable
public List<String> put(String key, List<String> value) {
List<String> previousValues = get(key);
this.headers.removeHeader(key);
value.forEach(v -> this.headers.addValue(key).setString(v));
return previousValues;
}

17
spring-web/src/test/java/org/springframework/http/server/reactive/HeadersAdaptersTests.java

@ -16,12 +16,14 @@ @@ -16,12 +16,14 @@
package org.springframework.http.server.reactive;
import java.util.Arrays;
import java.util.Locale;
import io.netty.handler.codec.http.DefaultHttpHeaders;
import io.undertow.util.HeaderMap;
import org.apache.tomcat.util.http.MimeHeaders;
import org.eclipse.jetty.http.HttpFields;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@ -57,6 +59,11 @@ public class HeadersAdaptersTests { @@ -57,6 +59,11 @@ public class HeadersAdaptersTests {
};
}
@After
public void tearDown() {
this.headers.clear();
}
@Test
public void getWithUnknownHeaderShouldReturnNull() {
assertNull(this.headers.get("Unknown"));
@ -96,4 +103,12 @@ public class HeadersAdaptersTests { @@ -96,4 +103,12 @@ public class HeadersAdaptersTests {
assertEquals("first", this.headers.get("TestHeader").get(0));
}
}
@Test
public void putShouldOverrideExisting() {
this.headers.add("TestHeader", "first");
this.headers.put("TestHeader", Arrays.asList("override"));
assertEquals("override", this.headers.getFirst("TestHeader"));
assertEquals(1, this.headers.get("TestHeader").size());
}
}
Loading…
Cancel
Save