From b3acabfecfdcd666875cdc06f718b931040cdd03 Mon Sep 17 00:00:00 2001 From: buildmaster Date: Tue, 5 Dec 2023 23:20:00 +0000 Subject: [PATCH 1/2] Bumping versions --- .../AbstractGatewayControllerEndpoint.java | 7 ++-- .../actuate/GatewayControllerEndpoint.java | 4 +-- .../GatewayControllerEndpointTests.java | 34 +++++++------------ 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/AbstractGatewayControllerEndpoint.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/AbstractGatewayControllerEndpoint.java index 47214e00..b6855992 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/AbstractGatewayControllerEndpoint.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/AbstractGatewayControllerEndpoint.java @@ -96,8 +96,8 @@ public class AbstractGatewayControllerEndpoint implements ApplicationEventPublis List globalFilters, List gatewayFilters, List routePredicates, RouteDefinitionWriter routeDefinitionWriter, RouteLocator routeLocator) { - this(routeDefinitionLocator, globalFilters, gatewayFilters, routePredicates, - routeDefinitionWriter, routeLocator, new WebEndpointProperties()); + this(routeDefinitionLocator, globalFilters, gatewayFilters, routePredicates, routeDefinitionWriter, + routeLocator, new WebEndpointProperties()); } public AbstractGatewayControllerEndpoint(RouteDefinitionLocator routeDefinitionLocator, @@ -126,8 +126,7 @@ public class AbstractGatewayControllerEndpoint implements ApplicationEventPublis .collectList(); } - private List mergeEndpoints(List listA, - List listB) { + private List mergeEndpoints(List listA, List listB) { Map> mergedMap = new HashMap<>(); Stream.concat(listA.stream(), listB.stream()).forEach(e -> mergedMap diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/GatewayControllerEndpoint.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/GatewayControllerEndpoint.java index 34553f86..08cd3b68 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/GatewayControllerEndpoint.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/actuate/GatewayControllerEndpoint.java @@ -50,8 +50,8 @@ public class GatewayControllerEndpoint extends AbstractGatewayControllerEndpoint List routePredicates, RouteDefinitionWriter routeDefinitionWriter, RouteLocator routeLocator, RouteDefinitionLocator routeDefinitionLocator, WebEndpointProperties webEndpointProperties) { - super(routeDefinitionLocator, globalFilters, gatewayFilters, routePredicates, - routeDefinitionWriter, routeLocator, webEndpointProperties); + super(routeDefinitionLocator, globalFilters, gatewayFilters, routePredicates, routeDefinitionWriter, + routeLocator, webEndpointProperties); } @GetMapping("/routedefinitions") diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/actuate/GatewayControllerEndpointTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/actuate/GatewayControllerEndpointTests.java index 05878ff5..eb555f88 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/actuate/GatewayControllerEndpointTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/actuate/GatewayControllerEndpointTests.java @@ -70,29 +70,21 @@ public class GatewayControllerEndpointTests { @Test public void testEndpoints() { - testClient.get().uri("http://localhost:" + port + "/actuator/gateway").exchange() - .expectStatus().isOk().expectBodyList(Map.class).consumeWith(result -> { + testClient.get().uri("http://localhost:" + port + "/actuator/gateway").exchange().expectStatus().isOk() + .expectBodyList(Map.class).consumeWith(result -> { List responseBody = result.getResponseBody(); assertThat(responseBody).isNotEmpty(); - assertThat(responseBody).contains( - Map.of("href", "/actuator/gateway/", "methods", - List.of("GET")), - Map.of("href", "/actuator/gateway/globalfilters", "methods", - List.of("GET")), - Map.of("href", "/actuator/gateway/refresh", "methods", - List.of("POST")), - Map.of("href", "/actuator/gateway/routedefinitions", - "methods", List.of("GET")), - Map.of("href", "/actuator/gateway/routefilters", "methods", - List.of("GET")), - Map.of("href", "/actuator/gateway/routepredicates", "methods", - List.of("GET")), - Map.of("href", "/actuator/gateway/routes", "methods", - List.of("POST", "GET")), - Map.of("href", "/actuator/gateway/routes/test-service", - "methods", List.of("POST", "DELETE", "GET")), - Map.of("href", "/actuator/gateway/routes/route_with_metadata", - "methods", List.of("POST", "DELETE", "GET"))); + assertThat(responseBody).contains(Map.of("href", "/actuator/gateway/", "methods", List.of("GET")), + Map.of("href", "/actuator/gateway/globalfilters", "methods", List.of("GET")), + Map.of("href", "/actuator/gateway/refresh", "methods", List.of("POST")), + Map.of("href", "/actuator/gateway/routedefinitions", "methods", List.of("GET")), + Map.of("href", "/actuator/gateway/routefilters", "methods", List.of("GET")), + Map.of("href", "/actuator/gateway/routepredicates", "methods", List.of("GET")), + Map.of("href", "/actuator/gateway/routes", "methods", List.of("POST", "GET")), + Map.of("href", "/actuator/gateway/routes/test-service", "methods", + List.of("POST", "DELETE", "GET")), + Map.of("href", "/actuator/gateway/routes/route_with_metadata", "methods", + List.of("POST", "DELETE", "GET"))); }); } From 82639855b6ec4289e52ba22e9d0d225c206e5e52 Mon Sep 17 00:00:00 2001 From: Muchnik Andrey Date: Tue, 12 Sep 2023 00:33:22 +0300 Subject: [PATCH 2/2] Support nullable flag value in ShortcutConfigurable.ShortcutType#GATHER_LIST_TAIL_FLAG Fixes gh-3049 --- .../gateway/support/ShortcutConfigurable.java | 2 +- .../support/ShortcutConfigurableTests.java | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ShortcutConfigurable.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ShortcutConfigurable.java index 5d8ee9f5..ec917fbe 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ShortcutConfigurable.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ShortcutConfigurable.java @@ -151,7 +151,7 @@ public interface ShortcutConfigurable { // strip boolean flag if last entry is true or false int lastIdx = values.size() - 1; String lastValue = values.get(lastIdx); - if (lastValue.equalsIgnoreCase("true") || lastValue.equalsIgnoreCase("false")) { + if ("true".equalsIgnoreCase(lastValue) || "false".equalsIgnoreCase(lastValue) || lastValue == null) { values = values.subList(0, lastIdx); map.put(fieldOrder.get(1), getValue(parser, beanFactory, lastValue)); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ShortcutConfigurableTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ShortcutConfigurableTests.java index 597de9ec..640f7d02 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ShortcutConfigurableTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ShortcutConfigurableTests.java @@ -182,6 +182,32 @@ public class ShortcutConfigurableTests { } } + @Test + public void testNormalizeGatherListTailFlagFlagIsNull() { + parser = new SpelExpressionParser(); + ShortcutConfigurable shortcutConfigurable = new ShortcutConfigurable() { + @Override + public List shortcutFieldOrder() { + return Arrays.asList("values", "flag"); + } + + @Override + public ShortcutType shortcutType() { + return ShortcutType.GATHER_LIST_TAIL_FLAG; + } + }; + Map args = new HashMap<>(); + args.put("1", "val0"); + args.put("2", "val1"); + args.put("3", "val2"); + args.put("4", null); + Map map = ShortcutType.GATHER_LIST_TAIL_FLAG.normalize(args, shortcutConfigurable, parser, + this.beanFactory); + assertThat(map).isNotNull().containsKey("values"); + assertThat((List) map.get("values")).containsExactly("val0", "val1", "val2"); + assertThat(map.get("flag")).isNull(); + } + @SpringBootConfiguration protected static class TestConfig {