Skip to content

Commit 23625ee

Browse files
committed
Do not send null HTTP header value in JdkClientHttpRequest
Prior to this commit, the `JdkClientHttpRequest` would add all values from `HttpHeaders` to the native request builder. This could cause `NullPointerException` being thrown at runtime because the `HttpClient` does not support that. This commit replicates a fix that was applied to the `SimpleClientHttpRequest`, turning null values into empty "". Fixes gh-35996
1 parent c89c4ac commit 23625ee

File tree

3 files changed

+25
-2
lines changed

3 files changed

+25
-2
lines changed

spring-web/src/main/java/org/springframework/http/client/JdkClientHttpRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ private HttpRequest buildRequest(HttpHeaders headers, @Nullable Body body) {
155155
headers.forEach((headerName, headerValues) -> {
156156
if (!DISALLOWED_HEADERS.contains(headerName.toLowerCase(Locale.ROOT))) {
157157
for (String headerValue : headerValues) {
158-
builder.header(headerName, headerValue);
158+
builder.header(headerName, (headerValue != null) ? headerValue : "");
159159
}
160160
}
161161
});

spring-web/src/main/java/org/springframework/http/client/OkHttp3ClientHttpRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ else if (okhttp3.internal.http.HttpMethod.requiresRequestBody(getMethod().name()
9090
builder.method(this.method.name(), requestBody);
9191
headers.forEach((headerName, headerValues) -> {
9292
for (String headerValue : headerValues) {
93-
builder.addHeader(headerName, headerValue);
93+
builder.addHeader(headerName, (headerValue != null) ? headerValue : "");
9494
}
9595
});
9696
Request request = builder.build();

spring-web/src/test/java/org/springframework/web/client/RestClientIntegrationTests.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -961,6 +961,29 @@ void defaultHeaders(ClientHttpRequestFactory requestFactory) {
961961
expectRequest(request -> assertThat(request.getHeader("foo")).isEqualTo("bar"));
962962
}
963963

964+
965+
@ParameterizedRestClientTest
966+
void sendNullHeaderValue(ClientHttpRequestFactory requestFactory) throws IOException {
967+
startServer(requestFactory);
968+
969+
prepareResponse(builder -> builder
970+
.setHeader("Content-Type", "text/plain").setBody("Hello Spring!"));
971+
972+
String result = this.restClient.get()
973+
.uri("/greeting")
974+
.httpRequest(request -> request.getHeaders().add("X-Test-Header", null))
975+
.retrieve()
976+
.body(String.class);
977+
978+
assertThat(result).isEqualTo("Hello Spring!");
979+
980+
expectRequestCount(1);
981+
expectRequest(request -> {
982+
assertThat(request.getHeaders().get("X-Test-Header")).isNullOrEmpty();
983+
assertThat(request.getPath()).isEqualTo("/greeting");
984+
});
985+
}
986+
964987
@ParameterizedRestClientTest
965988
void defaultRequest(ClientHttpRequestFactory requestFactory) {
966989
startServer(requestFactory);

0 commit comments

Comments
 (0)