From 1f607384315a1a07b5feccc1b8b01eeef9593820 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 15 Jan 2014 23:06:47 +0100 Subject: [PATCH] checkNotModified needs to consider HEAD as well Issue: SPR-11317 (cherry picked from commit 17cc63e) --- .../context/request/ServletWebRequest.java | 12 +++- .../request/ServletWebRequestTests.java | 59 +++++++++++++++++-- 2 files changed, 63 insertions(+), 8 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/context/request/ServletWebRequest.java b/spring-web/src/main/java/org/springframework/web/context/request/ServletWebRequest.java index ca6318f344a..20d8742caf8 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/ServletWebRequest.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/ServletWebRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,6 +47,8 @@ public class ServletWebRequest extends ServletRequestAttributes implements Nativ private static final String METHOD_GET = "GET"; + private static final String METHOD_HEAD = "HEAD"; + private HttpServletResponse response; @@ -155,7 +157,7 @@ public class ServletWebRequest extends ServletRequestAttributes implements Nativ long ifModifiedSince = getRequest().getDateHeader(HEADER_IF_MODIFIED_SINCE); this.notModified = (ifModifiedSince >= (lastModifiedTimestamp / 1000 * 1000)); if (this.response != null) { - if (this.notModified && METHOD_GET.equals(getRequest().getMethod())) { + if (this.notModified && supportsNotModifiedStatus()) { this.response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } else { @@ -172,7 +174,7 @@ public class ServletWebRequest extends ServletRequestAttributes implements Nativ String ifNoneMatch = getRequest().getHeader(HEADER_IF_NONE_MATCH); this.notModified = eTag.equals(ifNoneMatch); if (this.response != null) { - if (this.notModified && METHOD_GET.equals(getRequest().getMethod())) { + if (this.notModified && supportsNotModifiedStatus()) { this.response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } else { @@ -181,7 +183,11 @@ public class ServletWebRequest extends ServletRequestAttributes implements Nativ } } return this.notModified; + } + private boolean supportsNotModifiedStatus() { + String method = getRequest().getMethod(); + return (METHOD_GET.equals(method) || METHOD_HEAD.equals(method)); } public boolean isNotModified() { diff --git a/spring-web/src/test/java/org/springframework/web/context/request/ServletWebRequestTests.java b/spring-web/src/test/java/org/springframework/web/context/request/ServletWebRequestTests.java index 18598f31c55..a72c73c5eba 100644 --- a/spring-web/src/test/java/org/springframework/web/context/request/ServletWebRequestTests.java +++ b/spring-web/src/test/java/org/springframework/web/context/request/ServletWebRequestTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,6 +37,7 @@ import static org.junit.Assert.*; /** * @author Juergen Hoeller + * @author Markus Malkusch * @since 26.07.2006 */ public class ServletWebRequestTests { @@ -116,7 +117,7 @@ public class ServletWebRequestTests { } @Test - public void checkNotModifiedTimeStamp() { + public void checkNotModifiedTimeStampForGET() { long currentTime = new Date().getTime(); servletRequest.setMethod("GET"); servletRequest.addHeader("If-Modified-Since", currentTime); @@ -127,7 +128,7 @@ public class ServletWebRequestTests { } @Test - public void checkModifiedTimeStamp() { + public void checkModifiedTimeStampForGET() { long currentTime = new Date().getTime(); long oneMinuteAgo = currentTime - (1000 * 60); servletRequest.setMethod("GET"); @@ -140,7 +141,7 @@ public class ServletWebRequestTests { } @Test - public void checkNotModifiedETag() { + public void checkNotModifiedETagForGET() { String eTag = "\"Foo\""; servletRequest.setMethod("GET"); servletRequest.addHeader("If-None-Match", eTag ); @@ -151,7 +152,7 @@ public class ServletWebRequestTests { } @Test - public void checkModifiedETag() { + public void checkModifiedETagForGET() { String currentETag = "\"Foo\""; String oldEtag = "Bar"; servletRequest.setMethod("GET"); @@ -163,4 +164,52 @@ public class ServletWebRequestTests { assertEquals(currentETag, servletResponse.getHeader("ETag")); } + @Test + public void checkNotModifiedTimeStampForHEAD() { + long currentTime = new Date().getTime(); + servletRequest.setMethod("HEAD"); + servletRequest.addHeader("If-Modified-Since", currentTime); + + request.checkNotModified(currentTime); + + assertEquals(304, servletResponse.getStatus()); + } + + @Test + public void checkModifiedTimeStampForHEAD() { + long currentTime = new Date().getTime(); + long oneMinuteAgo = currentTime - (1000 * 60); + servletRequest.setMethod("HEAD"); + servletRequest.addHeader("If-Modified-Since", oneMinuteAgo); + + request.checkNotModified(currentTime); + + assertEquals(200, servletResponse.getStatus()); + assertEquals(""+currentTime, servletResponse.getHeader("Last-Modified")); + } + + @Test + public void checkNotModifiedETagForHEAD() { + String eTag = "\"Foo\""; + servletRequest.setMethod("HEAD"); + servletRequest.addHeader("If-None-Match", eTag ); + + request.checkNotModified(eTag); + + assertEquals(304, servletResponse.getStatus()); + } + + @Test + public void checkModifiedETagForHEAD() { + String currentETag = "\"Foo\""; + String oldEtag = "Bar"; + servletRequest.setMethod("HEAD"); + servletRequest.addHeader("If-None-Match", oldEtag); + + request.checkNotModified(currentETag); + + assertEquals(200, servletResponse.getStatus()); + assertEquals(currentETag, servletResponse.getHeader("ETag")); + } + }