From 83c19cd60ee95dd315237c24f1fcfd358e58d53b Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Tue, 15 Dec 2020 13:23:53 +0100 Subject: [PATCH] Fix NPE when calling NettyHeadersAdapter.add() Prior to this commit, the `NettyHeadersAdapter` would directly delegate the `add()` and `set()` calls to the adapted `io.netty.handler.codec.http.HttpHeaders`. This implementation rejects `null` values with exceptions. This commit aligns the behavior here with other implementations, by not rejecting null values but simply ignoring them. Fixes gh-26274 --- .../http/client/reactive/NettyHeadersAdapter.java | 8 ++++++-- .../http/server/reactive/NettyHeadersAdapter.java | 8 ++++++-- .../http/server/reactive/HeadersAdaptersTests.java | 8 ++++++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/client/reactive/NettyHeadersAdapter.java b/spring-web/src/main/java/org/springframework/http/client/reactive/NettyHeadersAdapter.java index c0c92750eb0..603a3e7380d 100644 --- a/spring-web/src/main/java/org/springframework/http/client/reactive/NettyHeadersAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/client/reactive/NettyHeadersAdapter.java @@ -56,7 +56,9 @@ class NettyHeadersAdapter implements MultiValueMap { @Override public void add(String key, @Nullable String value) { - this.headers.add(key, value); + if (value != null) { + this.headers.add(key, value); + } } @Override @@ -71,7 +73,9 @@ class NettyHeadersAdapter implements MultiValueMap { @Override public void set(String key, @Nullable String value) { - this.headers.set(key, value); + if (value != null) { + this.headers.set(key, value); + } } @Override diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/NettyHeadersAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/NettyHeadersAdapter.java index 4d96585fda9..dceddb7fb3a 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/NettyHeadersAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/NettyHeadersAdapter.java @@ -56,7 +56,9 @@ class NettyHeadersAdapter implements MultiValueMap { @Override public void add(String key, @Nullable String value) { - this.headers.add(key, value); + if (value != null) { + this.headers.add(key, value); + } } @Override @@ -71,7 +73,9 @@ class NettyHeadersAdapter implements MultiValueMap { @Override public void set(String key, @Nullable String value) { - this.headers.set(key, value); + if (value != null) { + this.headers.set(key, value); + } } @Override diff --git a/spring-web/src/test/java/org/springframework/http/server/reactive/HeadersAdaptersTests.java b/spring-web/src/test/java/org/springframework/http/server/reactive/HeadersAdaptersTests.java index ba0deea0179..1b7d34290b6 100644 --- a/spring-web/src/test/java/org/springframework/http/server/reactive/HeadersAdaptersTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/reactive/HeadersAdaptersTests.java @@ -94,6 +94,14 @@ class HeadersAdaptersTests { assertThat(headers.get("TestHeader").size()).isEqualTo(1); } + @ParameterizedHeadersTest + void nullValuesShouldNotFail(String displayName, MultiValueMap headers) { + headers.add("TestHeader", null); + assertThat(headers.getFirst("TestHeader")).isNull(); + headers.set("TestHeader", null); + assertThat(headers.getFirst("TestHeader")).isNull(); + } + @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @ParameterizedTest(name = "[{index}] {0}")