From c1972f6db6a4235f763bf6eed0df9daf23b452df Mon Sep 17 00:00:00 2001 From: csk8167 Date: Thu, 28 Sep 2023 17:45:11 +0200 Subject: [PATCH 1/2] Support IPv6 addresses when configuring RabbitMQ using properties See gh-37619 --- .../PropertiesRabbitConnectionDetails.java | 6 ++- ...PropertiesRabbitConnectionDetailsTest.java | 42 +++++++++++++++++++ .../amqp/RabbitPropertiesTests.java | 7 ++++ 3 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetailsTest.java diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetails.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetails.java index 3e4c485d44..a5a27f510d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetails.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetails.java @@ -53,8 +53,10 @@ class PropertiesRabbitConnectionDetails implements RabbitConnectionDetails { public List
getAddresses() { List
addresses = new ArrayList<>(); for (String address : this.properties.determineAddresses().split(",")) { - String[] components = address.split(":"); - addresses.add(new Address(components[0], Integer.parseInt(components[1]))); + int portSeparatorPosition = address.lastIndexOf(':'); + String host = address.substring(0, portSeparatorPosition); + String port = address.substring(portSeparatorPosition + 1); + addresses.add(new Address(host, Integer.parseInt(port))); } return addresses; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetailsTest.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetailsTest.java new file mode 100644 index 0000000000..99643fe7fd --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetailsTest.java @@ -0,0 +1,42 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.amqp; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.autoconfigure.amqp.RabbitConnectionDetails.Address; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class PropertiesRabbitConnectionDetailsTest { + + @Test + void getAddresses() { + RabbitProperties properties = new RabbitProperties(); + properties.setAddresses("localhost:1234,[::1]:32863"); + PropertiesRabbitConnectionDetails propertiesRabbitConnectionDetails = new PropertiesRabbitConnectionDetails(properties); + List
addresses = propertiesRabbitConnectionDetails.getAddresses(); + assertThat(addresses.size()).isEqualTo(2); + assertThat(addresses.get(0).host()).isEqualTo("localhost"); + assertThat(addresses.get(1).host()).isEqualTo("[::1]"); + assertThat(addresses.get(0).port()).isEqualTo(1234); + assertThat(addresses.get(1).port()).isEqualTo(32863); + } +} \ No newline at end of file diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitPropertiesTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitPropertiesTests.java index 998f5a88d9..41657e8b96 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitPropertiesTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitPropertiesTests.java @@ -274,6 +274,13 @@ class RabbitPropertiesTests { assertThat(this.properties.determineAddresses()).isEqualTo("localhost:5671"); } + @Test + void determineAddressesUsesHostAndPortPropertiesWhenNoAddressesSetIpV6() { + this.properties.setHost("[::1]"); + this.properties.setPort(32863); + assertThat(this.properties.determineAddresses()).isEqualTo("[::1]:32863"); + } + @Test void determineAddressesUsesHostAndPortPropertiesWhenNoAddressesSet() { this.properties.setHost("rabbit.example.com"); From fad43adf144129730733c0500e55a326f529e99d Mon Sep 17 00:00:00 2001 From: Scott Frederick Date: Thu, 28 Sep 2023 16:07:25 -0500 Subject: [PATCH 2/2] Polish "Support IPv6 addresses when configuring RabbitMQ using properties" See gh-37619 --- .../PropertiesRabbitConnectionDetails.java | 6 ++-- ...opertiesRabbitConnectionDetailsTests.java} | 30 +++++++++++++------ .../amqp/RabbitPropertiesTests.java | 14 ++++----- 3 files changed, 31 insertions(+), 19 deletions(-) rename spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/{PropertiesRabbitConnectionDetailsTest.java => PropertiesRabbitConnectionDetailsTests.java} (59%) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetails.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetails.java index a5a27f510d..1ac95b513f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetails.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetails.java @@ -53,9 +53,9 @@ class PropertiesRabbitConnectionDetails implements RabbitConnectionDetails { public List
getAddresses() { List
addresses = new ArrayList<>(); for (String address : this.properties.determineAddresses().split(",")) { - int portSeparatorPosition = address.lastIndexOf(':'); - String host = address.substring(0, portSeparatorPosition); - String port = address.substring(portSeparatorPosition + 1); + int portSeparatorIndex = address.lastIndexOf(':'); + String host = address.substring(0, portSeparatorIndex); + String port = address.substring(portSeparatorIndex + 1); addresses.add(new Address(host, Integer.parseInt(port))); } return addresses; diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetailsTest.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetailsTests.java similarity index 59% rename from spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetailsTest.java rename to spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetailsTests.java index 99643fe7fd..fb4f65d9cf 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetailsTest.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetailsTests.java @@ -23,20 +23,32 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.amqp.RabbitConnectionDetails.Address; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; -class PropertiesRabbitConnectionDetailsTest { +/** + * Tests for {@link PropertiesRabbitConnectionDetails}. + * + * @author Jonas Fügedi + */ +class PropertiesRabbitConnectionDetailsTests { + + private static final int DEFAULT_PORT = 5672; @Test void getAddresses() { RabbitProperties properties = new RabbitProperties(); - properties.setAddresses("localhost:1234,[::1]:32863"); - PropertiesRabbitConnectionDetails propertiesRabbitConnectionDetails = new PropertiesRabbitConnectionDetails(properties); + properties.setAddresses("localhost,localhost:1234,[::1],[::1]:32863"); + PropertiesRabbitConnectionDetails propertiesRabbitConnectionDetails = new PropertiesRabbitConnectionDetails( + properties); List
addresses = propertiesRabbitConnectionDetails.getAddresses(); - assertThat(addresses.size()).isEqualTo(2); + assertThat(addresses.size()).isEqualTo(4); assertThat(addresses.get(0).host()).isEqualTo("localhost"); - assertThat(addresses.get(1).host()).isEqualTo("[::1]"); - assertThat(addresses.get(0).port()).isEqualTo(1234); - assertThat(addresses.get(1).port()).isEqualTo(32863); + assertThat(addresses.get(0).port()).isEqualTo(DEFAULT_PORT); + assertThat(addresses.get(1).host()).isEqualTo("localhost"); + assertThat(addresses.get(1).port()).isEqualTo(1234); + assertThat(addresses.get(2).host()).isEqualTo("[::1]"); + assertThat(addresses.get(2).port()).isEqualTo(DEFAULT_PORT); + assertThat(addresses.get(3).host()).isEqualTo("[::1]"); + assertThat(addresses.get(3).port()).isEqualTo(32863); } -} \ No newline at end of file + +} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitPropertiesTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitPropertiesTests.java index 41657e8b96..5107b38adb 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitPropertiesTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitPropertiesTests.java @@ -274,13 +274,6 @@ class RabbitPropertiesTests { assertThat(this.properties.determineAddresses()).isEqualTo("localhost:5671"); } - @Test - void determineAddressesUsesHostAndPortPropertiesWhenNoAddressesSetIpV6() { - this.properties.setHost("[::1]"); - this.properties.setPort(32863); - assertThat(this.properties.determineAddresses()).isEqualTo("[::1]:32863"); - } - @Test void determineAddressesUsesHostAndPortPropertiesWhenNoAddressesSet() { this.properties.setHost("rabbit.example.com"); @@ -288,6 +281,13 @@ class RabbitPropertiesTests { assertThat(this.properties.determineAddresses()).isEqualTo("rabbit.example.com:1234"); } + @Test + void determineAddressesUsesIpv6HostAndPortPropertiesWhenNoAddressesSet() { + this.properties.setHost("[::1]"); + this.properties.setPort(32863); + assertThat(this.properties.determineAddresses()).isEqualTo("[::1]:32863"); + } + @Test void determineSslUsingAmqpsReturnsStateOfFirstAddress() { this.properties.setAddresses("amqps://root:password@otherhost,amqp://root:password2@otherhost2");