diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java index 644e5ebc088..8fff526636b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java @@ -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 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 httpRanges = inputMessage.getHeaders().getRange(); @@ -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); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessorMockTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessorMockTests.java index 060a9e1d08b..c698f50a768 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessorMockTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessorMockTests.java @@ -568,8 +568,24 @@ public class HttpEntityMethodProcessorMockTests { assertThat(servletResponse.getHeader(HttpHeaders.ACCEPT_RANGES), Matchers.isEmptyOrNullString()); } + @Test //SPR-16921 + public void disableRangeSupportIfContentRangePresent() throws Exception { + ResponseEntity 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 returnValue = ResponseEntity.ok().header(HttpHeaders.ETAG, etagValue).body("body");