From f35ed8d04451991f4a8d8daf39ca6c04aade7e15 Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Wed, 16 Oct 2024 15:55:34 +0800 Subject: [PATCH] Improve check whether to lowercase scheme See gh-33715 ``` Map has no value for 'thescheme' java.lang.IllegalArgumentException: Map has no value for 'thescheme' at org.springframework.web.util.UriComponents$MapTemplateVariables.getValue(UriComponents.java:348) at org.springframework.web.util.UriComponents.expandUriComponent(UriComponents.java:263) at org.springframework.web.util.HierarchicalUriComponents.expandInternal(HierarchicalUriComponents.java:436) at org.springframework.web.util.HierarchicalUriComponents.expandInternal(HierarchicalUriComponents.java:53) at org.springframework.web.util.UriComponents.expand(UriComponents.java:161) at org.springframework.web.util.UriComponentsBuilder.buildAndExpand(UriComponentsBuilder.java:364) ``` --- .../web/util/RfcUriParser.java | 3 ++- .../web/util/UriComponentsBuilderTests.java | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/web/util/RfcUriParser.java b/spring-web/src/main/java/org/springframework/web/util/RfcUriParser.java index 76f9d72b31..b7b955be44 100644 --- a/spring-web/src/main/java/org/springframework/web/util/RfcUriParser.java +++ b/spring-web/src/main/java/org/springframework/web/util/RfcUriParser.java @@ -29,6 +29,7 @@ import org.springframework.util.Assert; * Parser for URI's based on RFC 3986 syntax. * * @author Rossen Stoyanchev + * @author Yanming Zhou * @since 6.2 * * @see RFC 3986 @@ -510,7 +511,7 @@ abstract class RfcUriParser { public InternalParser captureScheme() { String scheme = captureComponent("scheme"); - this.scheme = (!scheme.startsWith("{") ? scheme.toLowerCase(Locale.ROOT) : scheme); + this.scheme = (!scheme.contains("{") ? scheme.toLowerCase(Locale.ROOT) : scheme); return this; } diff --git a/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java b/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java index 1af1ad3149..4d93541910 100644 --- a/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java @@ -47,6 +47,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException * @author Juergen Hoeller * @author Sam Brannen * @author David Eckel + * @author Yanming Zhou */ class UriComponentsBuilderTests { @@ -637,6 +638,24 @@ class UriComponentsBuilderTests { .buildAndExpand(Map.of("TheScheme", "ws")) .toUri(); assertThat(uri.toString()).isEqualTo("ws://example.org"); + + uri = UriComponentsBuilder + .fromUriString("{TheScheme}s://example.org", parserType) + .buildAndExpand(Map.of("TheScheme", "ws")) + .toUri(); + assertThat(uri.toString()).isEqualTo("wss://example.org"); + + uri = UriComponentsBuilder + .fromUriString("s{TheScheme}://example.org", parserType) + .buildAndExpand(Map.of("TheScheme", "ws")) + .toUri(); + assertThat(uri.toString()).isEqualTo("sws://example.org"); + + uri = UriComponentsBuilder + .fromUriString("s{TheScheme}s://example.org", parserType) + .buildAndExpand(Map.of("TheScheme", "ws")) + .toUri(); + assertThat(uri.toString()).isEqualTo("swss://example.org"); } @ParameterizedTest