From 8628aa1c8ad31a72f3623773b69ab150ceba32dc Mon Sep 17 00:00:00 2001 From: Andrey Litvitski Date: Thu, 19 Dec 2024 19:33:25 +0300 Subject: [PATCH] Prevent duplicate entries in channels map Prevents duplicate entries from being added to the named channels map in client properties. Resolves #67 --- .../client/GrpcClientAutoConfiguration.java | 2 +- .../autoconfigure/client/GrpcClientProperties.java | 9 +++++++++ .../client/GrpcClientPropertiesTests.java | 13 +++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/client/GrpcClientAutoConfiguration.java b/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/client/GrpcClientAutoConfiguration.java index a70d205..4ec67a1 100644 --- a/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/client/GrpcClientAutoConfiguration.java +++ b/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/client/GrpcClientAutoConfiguration.java @@ -86,7 +86,7 @@ public class GrpcClientAutoConfiguration { @Override public String getTarget(String authority) { NamedChannel channel = this.channels.getChannel(authority); - return this.channels.getTarget(channel.getAddress()); + return this.channels.getTarget(channel); } } diff --git a/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/client/GrpcClientProperties.java b/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/client/GrpcClientProperties.java index d3ce5fc..202dd2d 100644 --- a/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/client/GrpcClientProperties.java +++ b/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/client/GrpcClientProperties.java @@ -83,6 +83,15 @@ public class GrpcClientProperties implements EnvironmentAware { return address; } + public String getTarget(NamedChannel channel) { + String address = channel.getAddress(); + if (address.startsWith("static:") || address.startsWith("tcp:")) { + address = address.substring(address.indexOf(":") + 1).replaceFirst("/*", ""); + } + address = this.environment.resolvePlaceholders(address); + return address; + } + public static class NamedChannel { /** diff --git a/spring-grpc-spring-boot-autoconfigure/src/test/java/org/springframework/grpc/autoconfigure/client/GrpcClientPropertiesTests.java b/spring-grpc-spring-boot-autoconfigure/src/test/java/org/springframework/grpc/autoconfigure/client/GrpcClientPropertiesTests.java index b1867f4..b2db271 100644 --- a/spring-grpc-spring-boot-autoconfigure/src/test/java/org/springframework/grpc/autoconfigure/client/GrpcClientPropertiesTests.java +++ b/spring-grpc-spring-boot-autoconfigure/src/test/java/org/springframework/grpc/autoconfigure/client/GrpcClientPropertiesTests.java @@ -200,6 +200,19 @@ class GrpcClientPropertiesTests { assertThat(properties.getChannels()).containsOnlyKeys("custom"); } + @Test + void withCustomChannelReturnsDuplicateEntryMap() { + Map map = new HashMap<>(); + map.put("spring.grpc.client.channels.custom.address", "static://my-server:8888"); + GrpcClientProperties properties = bindProperties(map); + GrpcClientAutoConfiguration.NamedChannelVirtualTargets virtualTargets = new GrpcClientAutoConfiguration.NamedChannelVirtualTargets( + properties); + var address = virtualTargets.getTarget("custom"); + assertThat(address).isEqualTo("my-server:8888"); + assertThat(properties.getTarget("custom")).isEqualTo("my-server:8888"); + assertThat(properties.getChannels()).containsOnlyKeys("custom"); + } + } }