Provide access to HTTP headers in resource routing

This commit adds additional overloaded methods that allow for HTTP
header manipulation of served resources.

Closes gh-29985
This commit is contained in:
Jakob Fels
2023-01-16 21:00:53 +01:00
committed by Arjen Poutsma
parent faaf3a61f2
commit ad50de169c
6 changed files with 138 additions and 5 deletions

View File

@@ -17,6 +17,7 @@
package org.springframework.web.reactive.function.server;
import java.io.IOException;
import java.time.Duration;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -28,6 +29,8 @@ import reactor.test.StepVerifier;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.CacheControl;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.MediaType;
@@ -130,6 +133,28 @@ public class RouterFunctionBuilderTests {
.verifyComplete();
}
@Test
public void resourcesCaching() {
Resource resource = new ClassPathResource("/org/springframework/web/reactive/function/server/");
assertThat(resource.exists()).isTrue();
RouterFunction<ServerResponse> route = RouterFunctions.route()
.resources("/resources/**", resource, resource1 -> CacheControl.maxAge(Duration.ofSeconds(60)))
.build();
MockServerHttpRequest mockRequest = MockServerHttpRequest.get("https://localhost/resources/response.txt").build();
ServerRequest resourceRequest = new DefaultServerRequest(MockServerWebExchange.from(mockRequest), Collections.emptyList());
Mono<String> responseMono = route.route(resourceRequest)
.flatMap(handlerFunction -> handlerFunction.handle(resourceRequest))
.map(ServerResponse::headers)
.mapNotNull(HttpHeaders::getCacheControl);
StepVerifier.create(responseMono)
.expectNext("max-age=60")
.verifyComplete();
}
@Test
public void nest() {
RouterFunction<?> route = RouterFunctions.route()