From 9960ed55aa3ce3f75dd8c5a0e550438323a0344a Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Wed, 6 Nov 2019 15:36:25 +0000 Subject: [PATCH] Fix condition in ServletInvocableHandlerMethod Closes gh-23775 --- .../ServletInvocableHandlerMethod.java | 2 +- .../ServletInvocableHandlerMethodTests.java | 23 ++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.java index b647557900..9d574bef38 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.java @@ -166,7 +166,7 @@ public class ServletInvocableHandlerMethod extends InvocableHandlerMethod { } private void disableContentCachingIfNecessary(ServletWebRequest webRequest) { - if (!isRequestNotModified(webRequest)) { + if (isRequestNotModified(webRequest)) { HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class); Assert.notNull(response, "Expected HttpServletResponse"); if (StringUtils.hasText(response.getHeader(HttpHeaders.ETAG))) { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethodTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethodTests.java index cd9e35a829..2967766579 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethodTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethodTests.java @@ -31,6 +31,7 @@ import reactor.core.publisher.Flux; import org.springframework.core.MethodParameter; import org.springframework.core.ResolvableType; import org.springframework.core.annotation.AliasFor; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageConverter; @@ -46,6 +47,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.ServletWebRequest; import org.springframework.web.context.request.async.DeferredResult; +import org.springframework.web.filter.ShallowEtagHeaderFilter; import org.springframework.web.method.annotation.RequestParamMethodArgumentResolver; import org.springframework.web.method.support.HandlerMethodArgumentResolverComposite; import org.springframework.web.method.support.HandlerMethodReturnValueHandler; @@ -130,7 +132,26 @@ public class ServletInvocableHandlerMethodTests { ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new Handler(), "notModified"); handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); - assertThat(this.mavContainer.isRequestHandled()).as("Null return value + 'not modified' request should result in 'request handled'").isTrue(); + assertThat(this.mavContainer.isRequestHandled()) + .as("Null return value + 'not modified' request should result in 'request handled'") + .isTrue(); + } + + @Test // gh-23775 + public void invokeAndHandle_VoidNotModifiedWithEtag() throws Exception { + String etag = "\"deadb33f8badf00d\""; + this.request.addHeader(HttpHeaders.IF_NONE_MATCH, etag); + this.webRequest.checkNotModified(etag); + + ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new Handler(), "notModified"); + handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); + + assertThat(this.mavContainer.isRequestHandled()) + .as("Null return value + 'not modified' request should result in 'request handled'") + .isTrue(); + + assertThat(this.request.getAttribute(ShallowEtagHeaderFilter.class.getName() + ".STREAMING")) + .isEqualTo(true); } @Test // SPR-9159