Don't implicitly check preconditions on PUT requests

Prior to this commit, the `HttpEntityMethodProcessor` would check HTTP
conditions on non-safe requests (i.e. not GET/HEAD). This would prevent
Controllers from returning `ResponseEntity` containing response headers
with updated values of `"Last-Modified"` or `ETag` once the resource has
been updated.

This commit avoids those checks for non GET/HEAD requests - this code
can still be leveraged from Controllers themselves using
`ServletWebRequest::checkNotModified` methods.

Issue: SPR-15780
(cherry picked from ed7684d2b2)
This commit is contained in:
Brian Clozel
2018-03-08 19:43:01 +01:00
parent ff53a26333
commit 6fa9539ae2
2 changed files with 23 additions and 3 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2018 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.
@@ -511,6 +511,21 @@ public class HttpEntityMethodProcessorMockTests {
assertConditionalResponse(HttpStatus.OK, "body", etagValue, -1);
}
@Test
public void shouldNotFailPreconditionForPutRequests() throws Exception {
servletRequest.setMethod("PUT");
long dateTime = new Date().getTime();
servletRequest.addHeader(HttpHeaders.IF_UNMODIFIED_SINCE, dateFormat.format(dateTime));
long justModified = dateTime + 1;
ResponseEntity<String> returnValue = ResponseEntity.ok()
.lastModified(justModified).body("body");
initStringMessageConversion(MediaType.TEXT_PLAIN);
processor.handleReturnValue(returnValue, returnTypeResponseEntity, mavContainer, webRequest);
assertConditionalResponse(HttpStatus.OK, null, null, justModified);
}
@Test
public void varyHeader() throws Exception {
String[] entityValues = {"Accept-Language", "User-Agent"};