Restore attributes for failed AND/OR request predicates

This commit restores the attributes when either of the predicates in
an AND/OR conjunction is false.

Issue: SPR-17210
This commit is contained in:
Arjen Poutsma
2018-09-11 13:24:03 +02:00
parent 8e83f140d4
commit a680880a9b
2 changed files with 58 additions and 12 deletions

View File

@@ -16,16 +16,23 @@
package org.springframework.web.reactive.function.server;
import java.util.Map;
import org.junit.Test;
import reactor.core.publisher.Mono;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import static org.junit.Assert.*;
import static org.springframework.web.reactive.function.server.RequestPredicates.*;
import static org.springframework.web.reactive.function.server.RouterFunctions.*;
import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
import static org.springframework.web.reactive.function.server.RequestPredicates.all;
import static org.springframework.web.reactive.function.server.RequestPredicates.method;
import static org.springframework.web.reactive.function.server.RequestPredicates.path;
import static org.springframework.web.reactive.function.server.RouterFunctions.nest;
import static org.springframework.web.reactive.function.server.RouterFunctions.route;
/**
* @author Arjen Poutsma
@@ -45,7 +52,8 @@ public class NestedRouteIntegrationTests extends AbstractRouterFunctionIntegrati
route(GET("/bar"), nestedHandler::variables).and(
nest(GET("/{bar}"),
route(GET("/{baz}"), nestedHandler::variables))))
.andRoute(GET("/{qux}/quux"), nestedHandler::variables);
.andRoute(path("/{qux}/quux").and(method(HttpMethod.GET)), nestedHandler::variables)
.andRoute(all(), nestedHandler::variables);
}
@@ -89,7 +97,7 @@ public class NestedRouteIntegrationTests extends AbstractRouterFunctionIntegrati
// SPR 16692
@Test
public void removeFailedPathVariables() {
public void removeFailedNestedPathVariables() {
ResponseEntity<String> result =
restTemplate.getForEntity("http://localhost:" + port + "/qux/quux", String.class);
@@ -98,6 +106,17 @@ public class NestedRouteIntegrationTests extends AbstractRouterFunctionIntegrati
}
// SPR 17210
@Test
public void removeFailedPathVariablesAnd() {
ResponseEntity<String> result =
restTemplate.postForEntity("http://localhost:" + port + "/qux/quux", "", String.class);
assertEquals(HttpStatus.OK, result.getStatusCode());
assertEquals("{}", result.getBody());
}
private static class NestedHandler {
@@ -109,11 +128,15 @@ public class NestedRouteIntegrationTests extends AbstractRouterFunctionIntegrati
return ServerResponse.ok().syncBody("baz");
}
@SuppressWarnings("unchecked")
public Mono<ServerResponse> variables(ServerRequest request) {
assertEquals(request.pathVariables(),
request.attributes().get(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE));
Map<String, String> pathVariables = request.pathVariables();
Map<String, String> attributePathVariables =
(Map<String, String>) request.attributes().get(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
assertTrue( (pathVariables.equals(attributePathVariables))
|| (pathVariables.isEmpty() && (attributePathVariables == null)));
Mono<String> responseBody = Mono.just(request.pathVariables().toString());
Mono<String> responseBody = Mono.just(pathVariables.toString());
return ServerResponse.ok().body(responseBody, String.class);
}