From 3910fbff565cad3e1fc2a0cda0acfad6ea8595f6 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Sun, 16 Jul 2023 19:14:22 -0400 Subject: [PATCH] Fix IllegalArgumentException in equals and hashcodes. Fixes #2304 (#2307) Co-authored-by: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> --- .../ConfigServerConfigDataResource.java | 24 +++++++++++++------ .../ConfigServerConfigDataResourceTests.java | 11 +++++++++ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataResource.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataResource.java index e72253b9..89a312f3 100644 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataResource.java +++ b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataResource.java @@ -123,17 +123,27 @@ public class ConfigServerConfigDataResource extends ConfigDataResource { } private boolean uriEqual(String thisUriString, String thatUriString) { - UriComponents thisUri = UriComponentsBuilder.fromHttpUrl(thisUriString).build(); - UriComponents thatUri = UriComponentsBuilder.fromHttpUrl(thatUriString).build(); - return Objects.equals(thisUri.getHost(), thatUri.getHost()) - && Objects.equals(thisUri.getPort(), thatUri.getPort()) - && Objects.equals(thisUri.getPath(), thatUri.getPath()); + try { + UriComponents thisUri = UriComponentsBuilder.fromHttpUrl(thisUriString).build(); + UriComponents thatUri = UriComponentsBuilder.fromHttpUrl(thatUriString).build(); + return Objects.equals(thisUri.getHost(), thatUri.getHost()) + && Objects.equals(thisUri.getPort(), thatUri.getPort()) + && Objects.equals(thisUri.getPath(), thatUri.getPath()); + } + catch (Exception e) { + return Objects.equals(thisUriString, thatUriString); + } } private int urisHashCode(String[] uris) { return Arrays.stream(uris).mapToInt(uriString -> { - UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl(uriString).build(); - return Objects.hash(uriComponents.getHost(), uriComponents.getPath(), uriComponents.getPort()); + try { + UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl(uriString).build(); + return Objects.hash(uriComponents.getHost(), uriComponents.getPath(), uriComponents.getPort()); + } + catch (Exception e) { + return Arrays.hashCode(uris); + } }).sum(); } diff --git a/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataResourceTests.java b/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataResourceTests.java index de4f5ce8..b2d5726c 100644 --- a/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataResourceTests.java +++ b/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataResourceTests.java @@ -318,4 +318,15 @@ class ConfigServerConfigDataResourceTests { assertThat(r1.hashCode()).isNotEqualTo(r2.hashCode()); } + @Test + void testInvalidUri() { + ConfigClientProperties r1Properties = new ConfigClientProperties(); + r1Properties.setUri(new String[] { "//" }); + ConfigServerConfigDataResource r1 = new ConfigServerConfigDataResource(r1Properties, true, null); + ConfigClientProperties r2Properties = new ConfigClientProperties(); + r2Properties.setUri(new String[] { "//" }); + ConfigServerConfigDataResource r2 = new ConfigServerConfigDataResource(r2Properties, true, null); + assertThat(r1).isEqualTo(r2); + } + }