From 82639855b6ec4289e52ba22e9d0d225c206e5e52 Mon Sep 17 00:00:00 2001 From: Muchnik Andrey Date: Tue, 12 Sep 2023 00:33:22 +0300 Subject: [PATCH] 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 {