Skip to content

Commit 195f3f0

Browse files
committed
ResponseEntityResultHandler overwrites headers
Prior to this commit, controller handlers (regular and exception handlers as well) would not overwrite existing HTTP response headers on the exchange. This would lead to situations where Content-Type values set during the initial handling phase would not be overwritten when handling an error later on. This commit aligns the implementation of that result handler on the Spring MVC one in that regard. Issue: SPR-17082
1 parent 90d395e commit 195f3f0

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandler.java

-1
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,6 @@ else if (returnValue instanceof HttpHeaders) {
155155
HttpHeaders responseHeaders = exchange.getResponse().getHeaders();
156156
if (!entityHeaders.isEmpty()) {
157157
entityHeaders.entrySet().stream()
158-
.filter(entry -> !responseHeaders.containsKey(entry.getKey()))
159158
.forEach(entry -> responseHeaders.put(entry.getKey(), entry.getValue()));
160159
}
161160

spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandlerTests.java

+17
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.springframework.http.HttpHeaders;
4545
import org.springframework.http.HttpMethod;
4646
import org.springframework.http.HttpStatus;
47+
import org.springframework.http.MediaType;
4748
import org.springframework.http.ResponseEntity;
4849
import org.springframework.http.codec.EncoderHttpMessageWriter;
4950
import org.springframework.http.codec.HttpMessageWriter;
@@ -334,6 +335,22 @@ public void handleMonoWithWildcardBodyTypeAndNullBody() throws Exception {
334335
assertResponseBodyIsEmpty(exchange);
335336
}
336337

338+
@Test // SPR-17082
339+
public void handleResponseEntityWithExistingResponseHeaders() throws Exception {
340+
ResponseEntity<Void> value = ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).build();
341+
MethodParameter returnType = on(TestController.class).resolveReturnType(entity(Void.class));
342+
HandlerResult result = handlerResult(value, returnType);
343+
MockServerWebExchange exchange = MockServerWebExchange.from(get("/path"));
344+
exchange.getResponse().getHeaders().setContentType(MediaType.TEXT_PLAIN);
345+
this.resultHandler.handleResult(exchange, result).block(Duration.ofSeconds(5));
346+
347+
assertEquals(HttpStatus.OK, exchange.getResponse().getStatusCode());
348+
assertEquals(1, exchange.getResponse().getHeaders().size());
349+
assertEquals(MediaType.APPLICATION_JSON, exchange.getResponse().getHeaders().getContentType());
350+
assertResponseBodyIsEmpty(exchange);
351+
}
352+
353+
337354

338355
private void testHandle(Object returnValue, MethodParameter returnType) {
339356
MockServerWebExchange exchange = MockServerWebExchange.from(get("/path"));

0 commit comments

Comments
 (0)