From b0726ffbb3f2e6bd35ee74d8b7afd3f94ce921c6 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Tue, 27 Oct 2020 11:14:37 +0000 Subject: [PATCH] Full header support HTTP HEAD Resource requests Allow the body to be written in order for all headers to be set as they would be on HTTP GET. The body content is ignored as a lower level. See gh-25976 --- .../web/reactive/resource/ResourceWebHandler.java | 5 ----- .../resource/ResourceWebHandlerTests.java | 4 ---- .../resource/ResourceHttpRequestHandler.java | 4 ---- .../resource/ResourceHttpRequestHandlerTests.java | 15 ++++++++++++++- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java index 5d33a3d449..9da249f7c0 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java @@ -355,11 +355,6 @@ public class ResourceWebHandler implements WebHandler, InitializingBean { setHeaders(exchange, resource, mediaType); // Content phase - if (HttpMethod.HEAD.matches(exchange.getRequest().getMethodValue())) { - exchange.getResponse().getHeaders().set(HttpHeaders.ACCEPT_RANGES, "bytes"); - return Mono.empty(); - } - ResourceHttpMessageWriter writer = getResourceHttpMessageWriter(); Assert.state(writer != null, "No ResourceHttpMessageWriter"); return writer.write(Mono.just(resource), diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/resource/ResourceWebHandlerTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/resource/ResourceWebHandlerTests.java index 607eca3f6b..436e7a9f4c 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/resource/ResourceWebHandlerTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/resource/ResourceWebHandlerTests.java @@ -121,10 +121,6 @@ public class ResourceWebHandlerTests { assertEquals(headers.getLastModified() / 1000, resourceLastModifiedDate("test/foo.css") / 1000); assertEquals("bytes", headers.getFirst("Accept-Ranges")); assertEquals(1, headers.get("Accept-Ranges").size()); - - StepVerifier.create(exchange.getResponse().getBody()) - .expectErrorMatches(ex -> ex.getMessage().startsWith("No content was written")) - .verify(); } @Test diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java index ba40aa96d0..ab1e3bd09e 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java @@ -478,10 +478,6 @@ public class ResourceHttpRequestHandler extends WebContentGenerator setHeaders(response, resource, mediaType); // Content phase - if (METHOD_HEAD.equals(request.getMethod())) { - return; - } - ServletServerHttpResponse outputMessage = new ServletServerHttpResponse(response); if (request.getHeader(HttpHeaders.RANGE) == null) { Assert.state(this.resourceHttpMessageConverter != null, "Not initialized"); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java index 7ed815f74b..9be9f579c9 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java @@ -111,7 +111,6 @@ public class ResourceHttpRequestHandlerTests { assertEquals(resourceLastModified("test/foo.css") / 1000, this.response.getDateHeader("Last-Modified") / 1000); assertEquals("bytes", this.response.getHeader("Accept-Ranges")); assertEquals(1, this.response.getHeaders("Accept-Ranges").size()); - assertEquals(0, this.response.getContentAsByteArray().length); } @Test @@ -680,6 +679,20 @@ public class ResourceHttpRequestHandlerTests { assertEquals("Accept-Encoding", this.response.getHeaderValue("Vary")); } + @Test // gh-25976 + public void partialContentWithHttpHead() throws Exception { + this.request.setMethod("HEAD"); + this.request.addHeader("Range", "bytes=0-1"); + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "foo.txt"); + this.handler.handleRequest(this.request, this.response); + + assertEquals(206, this.response.getStatus()); + assertEquals("text/plain", this.response.getContentType()); + assertEquals(2, this.response.getContentLength()); + assertEquals("bytes 0-1/10", this.response.getHeader("Content-Range")); + assertEquals("bytes", this.response.getHeaderValue("Accept-Ranges")); + } + @Test // SPR-14005 public void doOverwriteExistingCacheControlHeaders() throws Exception { this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "foo.css");