diff --git a/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java b/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java index 396aff1b4aa..3b37c68d380 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java +++ b/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java @@ -152,6 +152,7 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable { this.host = other.host; this.port = other.port; this.pathBuilder = other.pathBuilder.cloneBuilder(); + this.uriVariables.putAll(other.uriVariables); this.queryParams.putAll(other.queryParams); this.fragment = other.fragment; this.encodeTemplate = other.encodeTemplate; 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 5eb27f3af73..a7b7d67e557 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 @@ -738,7 +738,7 @@ public class UriComponentsBuilderTests { } @Test - public void testClone() { + public void testCloneAndMerge() { UriComponentsBuilder builder1 = UriComponentsBuilder.newInstance(); builder1.scheme("http").host("e1.com").path("/p1").pathSegment("ps1").queryParam("q1").fragment("f1").encode(); @@ -760,6 +760,37 @@ public class UriComponentsBuilderTests { assertEquals("f2", result2.getFragment()); } + @Test // gh-24772 + public void testDeepClone() { + HashMap vars = new HashMap<>(); + vars.put("ps1", "foo"); + vars.put("ps2", "bar"); + + UriComponentsBuilder builder1 = UriComponentsBuilder.newInstance(); + builder1.scheme("http").host("e1.com").userInfo("user:pwd").path("/p1").pathSegment("{ps1}") + .pathSegment("{ps2}").queryParam("q1").fragment("f1").uriVariables(vars).encode(); + + UriComponentsBuilder builder2 = (UriComponentsBuilder) builder1.clone(); + + UriComponents result1 = builder1.build(); + assertEquals("http", result1.getScheme()); + assertEquals("user:pwd", result1.getUserInfo()); + assertEquals("e1.com", result1.getHost()); + assertEquals("/p1/foo/bar", result1.getPath()); + assertEquals("q1", result1.getQuery()); + assertEquals("f1", result1.getFragment()); + assertNull(result1.getSchemeSpecificPart()); + + UriComponents result2 = builder2.build(); + assertEquals("http", result2.getScheme()); + assertEquals("user:pwd", result2.getUserInfo()); + assertEquals("e1.com", result2.getHost()); + assertEquals("/p1/foo/bar", result2.getPath()); + assertEquals("q1", result2.getQuery()); + assertEquals("f1", result2.getFragment()); + assertNull(result1.getSchemeSpecificPart()); + } + @Test // SPR-11856 public void fromHttpRequestForwardedHeader() { MockHttpServletRequest request = new MockHttpServletRequest();