Browse Source

Refine Content-Range support for Resources

This commit restricts the support of `"Content-Range"` when returning
`Resource` instances from Controllers - now only "HTTP 200 OK" responses
will be considered, as Controllers might want to handle content range
themselves.

Issue: SPR-16921
pull/1869/merge
Brian Clozel 8 years ago
parent
commit
818e4b0776
  1. 6
      spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java
  2. 18
      spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessorMockTests.java

6
spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java

@ -64,6 +64,7 @@ import org.springframework.web.util.UrlPathHelper; @@ -64,6 +64,7 @@ import org.springframework.web.util.UrlPathHelper;
*
* @author Arjen Poutsma
* @author Rossen Stoyanchev
* @author Brian Clozel
* @since 3.1
*/
public abstract class AbstractMessageConverterMethodProcessor extends AbstractMessageConverterMethodArgumentResolver
@ -194,7 +195,8 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe @@ -194,7 +195,8 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
if (isResourceType(value, returnType)) {
outputMessage.getHeaders().set(HttpHeaders.ACCEPT_RANGES, "bytes");
if (value != null && inputMessage.getHeaders().getFirst(HttpHeaders.RANGE) != null) {
if (value != null && inputMessage.getHeaders().getFirst(HttpHeaders.RANGE) != null
&& outputMessage.getServletResponse().getStatus() == 200) {
Resource resource = (Resource) value;
try {
List<HttpRange> httpRanges = inputMessage.getHeaders().getRange();
@ -315,7 +317,7 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe @@ -315,7 +317,7 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
}
/**
* Return whether the returned value or the declared return type extend {@link Resource}.
* Return whether the returned value or the declared return type extends {@link Resource}.
*/
protected boolean isResourceType(@Nullable Object value, MethodParameter returnType) {
Class<?> clazz = getReturnValueType(value, returnType);

18
spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessorMockTests.java

@ -568,8 +568,24 @@ public class HttpEntityMethodProcessorMockTests { @@ -568,8 +568,24 @@ public class HttpEntityMethodProcessorMockTests {
assertThat(servletResponse.getHeader(HttpHeaders.ACCEPT_RANGES), Matchers.isEmptyOrNullString());
}
@Test //SPR-16921
public void disableRangeSupportIfContentRangePresent() throws Exception {
ResponseEntity<Resource> returnValue = ResponseEntity
.status(HttpStatus.PARTIAL_CONTENT)
.header(HttpHeaders.RANGE, "bytes=0-5")
.body(new ByteArrayResource("Content".getBytes(StandardCharsets.UTF_8)));
given(resourceRegionMessageConverter.canWrite(any(), eq(null))).willReturn(true);
given(resourceRegionMessageConverter.canWrite(any(), eq(APPLICATION_OCTET_STREAM))).willReturn(true);
processor.handleReturnValue(returnValue, returnTypeResponseEntityResource, mavContainer, webRequest);
then(resourceRegionMessageConverter).should(never()).write(anyCollection(), any(), any());
assertEquals(206, servletResponse.getStatus());
}
@Test //SPR-14767
public void shouldHandleValidatorHeadersInPutResponses() throws Exception {
public void shouldHandleValidatorHeadersInputResponses() throws Exception {
servletRequest.setMethod("PUT");
String etagValue = "\"some-etag\"";
ResponseEntity<String> returnValue = ResponseEntity.ok().header(HttpHeaders.ETAG, etagValue).body("body");

Loading…
Cancel
Save