From a421bd2c27dd77f7f6cb05b040d2024945199365 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Wed, 17 Jun 2015 10:08:58 +0200 Subject: [PATCH] Avoid duplicate Etag/Last-Modified header values This commit improves SPR-13090 and avoids adding duplicate ETag and Last-Modified headers in HTTP responses. Previously, those were added twice to the response since: * we're adding all ResponseEntity headers to the response * the `checkNotModified` methods automatically add those headers Issue: SPR-13090 --- .../annotation/HttpEntityMethodProcessor.java | 14 +++++++++++--- .../HttpEntityMethodProcessorMockTests.java | 6 ++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java index 0a88f5b849..e563bcd48c 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java @@ -168,12 +168,15 @@ public class HttpEntityMethodProcessor extends AbstractMessageConverterMethodPro } HttpHeaders entityHeaders = responseEntity.getHeaders(); - if (!entityHeaders.isEmpty()) { - outputMessage.getHeaders().putAll(entityHeaders); - } Object body = responseEntity.getBody(); if (responseEntity instanceof ResponseEntity) { + for (String headerName : entityHeaders.keySet()) { + if(!HttpHeaders.LAST_MODIFIED.equals(headerName) + && !HttpHeaders.ETAG.equals(headerName)) { + outputMessage.getHeaders().put(headerName, entityHeaders.get(headerName)); + } + } if (isResourceNotModified(webRequest, (ResponseEntity) responseEntity)) { // Ensure headers are flushed, no body should be written. outputMessage.flush(); @@ -181,6 +184,11 @@ public class HttpEntityMethodProcessor extends AbstractMessageConverterMethodPro return; } } + else { + if (!entityHeaders.isEmpty()) { + outputMessage.getHeaders().putAll(entityHeaders); + } + } // Try even with null body. ResponseBodyAdvice could get involved. writeWithMessageConverters(body, returnType, inputMessage, outputMessage); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessorMockTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessorMockTests.java index 65eec1d786..b169426cb3 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessorMockTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessorMockTests.java @@ -349,6 +349,7 @@ public class HttpEntityMethodProcessorMockTests { assertTrue(mavContainer.isRequestHandled()); assertEquals(HttpStatus.NOT_MODIFIED.value(), servletResponse.getStatus()); + assertEquals(1, servletResponse.getHeaderValues(HttpHeaders.LAST_MODIFIED).size()); assertEquals(dateFormat.format(oneMinuteAgo), servletResponse.getHeader(HttpHeaders.LAST_MODIFIED)); assertEquals(0, servletResponse.getContentAsByteArray().length); } @@ -369,6 +370,7 @@ public class HttpEntityMethodProcessorMockTests { assertTrue(mavContainer.isRequestHandled()); assertEquals(HttpStatus.NOT_MODIFIED.value(), servletResponse.getStatus()); + assertEquals(1, servletResponse.getHeaderValues(HttpHeaders.ETAG).size()); assertEquals(etagValue, servletResponse.getHeader(HttpHeaders.ETAG)); assertEquals(0, servletResponse.getContentAsByteArray().length); } @@ -393,7 +395,9 @@ public class HttpEntityMethodProcessorMockTests { assertTrue(mavContainer.isRequestHandled()); assertEquals(HttpStatus.NOT_MODIFIED.value(), servletResponse.getStatus()); + assertEquals(1, servletResponse.getHeaderValues(HttpHeaders.LAST_MODIFIED).size()); assertEquals(dateFormat.format(oneMinuteAgo), servletResponse.getHeader(HttpHeaders.LAST_MODIFIED)); + assertEquals(1, servletResponse.getHeaderValues(HttpHeaders.ETAG).size()); assertEquals(etagValue, servletResponse.getHeader(HttpHeaders.ETAG)); assertEquals(0, servletResponse.getContentAsByteArray().length); } @@ -419,7 +423,9 @@ public class HttpEntityMethodProcessorMockTests { assertTrue(mavContainer.isRequestHandled()); assertEquals(HttpStatus.OK.value(), servletResponse.getStatus()); + assertEquals(1, servletResponse.getHeaderValues(HttpHeaders.LAST_MODIFIED).size()); assertEquals(dateFormat.format(oneMinuteAgo), servletResponse.getHeader(HttpHeaders.LAST_MODIFIED)); + assertEquals(1, servletResponse.getHeaderValues(HttpHeaders.ETAG).size()); assertEquals(changedEtagValue, servletResponse.getHeader(HttpHeaders.ETAG)); assertEquals(0, servletResponse.getContentAsByteArray().length); }