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 0e070c3c806c..13ad367026d1 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 @@ -233,10 +233,7 @@ else if (validateIfUnmodifiedSince(lastModifiedTimestamp)) { private boolean validateIfMatch(@Nullable String eTag) { Enumeration ifMatchHeaders = getRequest().getHeaders(HttpHeaders.IF_MATCH); - if (SAFE_METHODS.contains(getRequest().getMethod())) { - return false; - } - if (!ifMatchHeaders.hasMoreElements()) { + if (SAFE_METHODS.contains(getRequest().getMethod()) || !ifMatchHeaders.hasMoreElements()) { return false; } this.notModified = matchRequestedETags(ifMatchHeaders, eTag, false); @@ -309,7 +306,7 @@ private boolean eTagWeakMatch(@Nullable String first, @Nullable String second) { return first.equals(second); } - private void updateResponseStateChanging(String eTag, long lastModifiedTimestamp) { + private void updateResponseStateChanging(@Nullable String eTag, long lastModifiedTimestamp) { if (this.notModified && getResponse() != null) { getResponse().setStatus(HttpStatus.PRECONDITION_FAILED.value()); } @@ -330,20 +327,18 @@ private boolean validateIfUnmodifiedSince(long lastModifiedTimestamp) { return true; } - private boolean validateIfModifiedSince(long lastModifiedTimestamp) { + private void validateIfModifiedSince(long lastModifiedTimestamp) { if (lastModifiedTimestamp < 0) { - return false; + return; } long ifModifiedSince = parseDateHeader(HttpHeaders.IF_MODIFIED_SINCE); - if (ifModifiedSince == -1) { - return false; + if (ifModifiedSince != -1) { + // We will perform this validation... + this.notModified = ifModifiedSince >= (lastModifiedTimestamp / 1000 * 1000); } - // We will perform this validation... - this.notModified = ifModifiedSince >= (lastModifiedTimestamp / 1000 * 1000); - return true; } - private void updateResponseIdempotent(String eTag, long lastModifiedTimestamp) { + private void updateResponseIdempotent(@Nullable String eTag, long lastModifiedTimestamp) { if (getResponse() != null) { boolean isHttpGetOrHead = SAFE_METHODS.contains(getRequest().getMethod()); if (this.notModified) { @@ -354,7 +349,7 @@ private void updateResponseIdempotent(String eTag, long lastModifiedTimestamp) { } } - private void addCachingResponseHeaders(String eTag, long lastModifiedTimestamp) { + private void addCachingResponseHeaders(@Nullable String eTag, long lastModifiedTimestamp) { if (SAFE_METHODS.contains(getRequest().getMethod())) { if (lastModifiedTimestamp > 0 && parseDateValue(getResponse().getHeader(HttpHeaders.LAST_MODIFIED)) == -1) { getResponse().setDateHeader(HttpHeaders.LAST_MODIFIED, lastModifiedTimestamp); diff --git a/spring-web/src/main/java/org/springframework/web/server/adapter/DefaultServerWebExchange.java b/spring-web/src/main/java/org/springframework/web/server/adapter/DefaultServerWebExchange.java index 06b949f955e8..43b7462fb91f 100644 --- a/spring-web/src/main/java/org/springframework/web/server/adapter/DefaultServerWebExchange.java +++ b/spring-web/src/main/java/org/springframework/web/server/adapter/DefaultServerWebExchange.java @@ -346,7 +346,7 @@ private boolean eTagWeakMatch(@Nullable String first, @Nullable String second) { return first.equals(second); } - private void updateResponseStateChanging(String eTag, Instant lastModified) { + private void updateResponseStateChanging(@Nullable String eTag, Instant lastModified) { if (this.notModified) { getResponse().setStatusCode(HttpStatus.PRECONDITION_FAILED); } @@ -401,17 +401,15 @@ private boolean validateIfUnmodifiedSince(Instant lastModified) { return true; } - private boolean validateIfModifiedSince(Instant lastModified) { + private void validateIfModifiedSince(Instant lastModified) { if (lastModified.isBefore(Instant.EPOCH)) { - return false; + return; } long ifModifiedSince = getRequestHeaders().getIfModifiedSince(); - if (ifModifiedSince == -1) { - return false; + if (ifModifiedSince != -1) { + // We will perform this validation... + this.notModified = ChronoUnit.SECONDS.between(lastModified, Instant.ofEpochMilli(ifModifiedSince)) >= 0; } - // We will perform this validation... - this.notModified = ChronoUnit.SECONDS.between(lastModified, Instant.ofEpochMilli(ifModifiedSince)) >= 0; - return true; } @Override