Merge branch '5.3.x'
This commit is contained in:
@@ -214,12 +214,12 @@ public class ServletWebRequest extends ServletRequestAttributes implements Nativ
|
||||
// Evaluate conditions in order of precedence.
|
||||
// See https://datatracker.ietf.org/doc/html/rfc9110#section-13.2.2
|
||||
if (validateIfMatch(eTag)) {
|
||||
updateResponseStateChanging();
|
||||
updateResponseStateChanging(eTag, lastModifiedTimestamp);
|
||||
return this.notModified;
|
||||
}
|
||||
// 2) If-Unmodified-Since
|
||||
else if (validateIfUnmodifiedSince(lastModifiedTimestamp)) {
|
||||
updateResponseStateChanging();
|
||||
updateResponseStateChanging(eTag, lastModifiedTimestamp);
|
||||
return this.notModified;
|
||||
}
|
||||
// 3) If-None-Match
|
||||
@@ -309,10 +309,13 @@ public class ServletWebRequest extends ServletRequestAttributes implements Nativ
|
||||
return first.equals(second);
|
||||
}
|
||||
|
||||
private void updateResponseStateChanging() {
|
||||
private void updateResponseStateChanging(String eTag, long lastModifiedTimestamp) {
|
||||
if (this.notModified && getResponse() != null) {
|
||||
getResponse().setStatus(HttpStatus.PRECONDITION_FAILED.value());
|
||||
}
|
||||
else {
|
||||
addCachingResponseHeaders(eTag, lastModifiedTimestamp);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean validateIfUnmodifiedSince(long lastModifiedTimestamp) {
|
||||
@@ -347,13 +350,17 @@ public class ServletWebRequest extends ServletRequestAttributes implements Nativ
|
||||
getResponse().setStatus(isHttpGetOrHead ?
|
||||
HttpStatus.NOT_MODIFIED.value() : HttpStatus.PRECONDITION_FAILED.value());
|
||||
}
|
||||
if (isHttpGetOrHead) {
|
||||
if (lastModifiedTimestamp > 0 && parseDateValue(getResponse().getHeader(HttpHeaders.LAST_MODIFIED)) == -1) {
|
||||
getResponse().setDateHeader(HttpHeaders.LAST_MODIFIED, lastModifiedTimestamp);
|
||||
}
|
||||
if (StringUtils.hasLength(eTag) && getResponse().getHeader(HttpHeaders.ETAG) == null) {
|
||||
getResponse().setHeader(HttpHeaders.ETAG, padEtagIfNecessary(eTag));
|
||||
}
|
||||
addCachingResponseHeaders(eTag, lastModifiedTimestamp);
|
||||
}
|
||||
}
|
||||
|
||||
private void addCachingResponseHeaders(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);
|
||||
}
|
||||
if (StringUtils.hasLength(eTag) && getResponse().getHeader(HttpHeaders.ETAG) == null) {
|
||||
getResponse().setHeader(HttpHeaders.ETAG, padEtagIfNecessary(eTag));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -259,12 +259,12 @@ public class DefaultServerWebExchange implements ServerWebExchange {
|
||||
// See https://datatracker.ietf.org/doc/html/rfc9110#section-13.2.2
|
||||
// 1) If-Match
|
||||
if (validateIfMatch(eTag)) {
|
||||
updateResponseStateChanging();
|
||||
updateResponseStateChanging(eTag, lastModified);
|
||||
return this.notModified;
|
||||
}
|
||||
// 2) If-Unmodified-Since
|
||||
else if (validateIfUnmodifiedSince(lastModified)) {
|
||||
updateResponseStateChanging();
|
||||
updateResponseStateChanging(eTag, lastModified);
|
||||
return this.notModified;
|
||||
}
|
||||
// 3) If-None-Match
|
||||
@@ -346,10 +346,13 @@ public class DefaultServerWebExchange implements ServerWebExchange {
|
||||
return first.equals(second);
|
||||
}
|
||||
|
||||
private void updateResponseStateChanging() {
|
||||
private void updateResponseStateChanging(String eTag, Instant lastModified) {
|
||||
if (this.notModified) {
|
||||
getResponse().setStatusCode(HttpStatus.PRECONDITION_FAILED);
|
||||
}
|
||||
else {
|
||||
addCachingResponseHeaders(eTag, lastModified);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean validateIfNoneMatch(@Nullable String eTag) {
|
||||
@@ -371,7 +374,11 @@ public class DefaultServerWebExchange implements ServerWebExchange {
|
||||
getResponse().setStatusCode(isSafeMethod ?
|
||||
HttpStatus.NOT_MODIFIED : HttpStatus.PRECONDITION_FAILED);
|
||||
}
|
||||
if (isSafeMethod) {
|
||||
addCachingResponseHeaders(eTag, lastModified);
|
||||
}
|
||||
|
||||
private void addCachingResponseHeaders(@Nullable String eTag, Instant lastModified) {
|
||||
if (SAFE_METHODS.contains(getRequest().getMethod())) {
|
||||
if (lastModified.isAfter(Instant.EPOCH) && getResponseHeaders().getLastModified() == -1) {
|
||||
getResponseHeaders().setLastModified(lastModified.toEpochMilli());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user