From 09bc5be63e16aaf19e2325099c9c6b5c07f4606f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?TingI=C4=81u=20=22Ting=22=20K=C3=AC?= Date: Sat, 15 Jun 2024 04:07:11 +0800 Subject: [PATCH] KAFKA-16946: Utils.getHost/getPort cannot parse SASL_PLAINTEXT://host:port (#16319) In previous PR(#16048), I mistakenly excluded the underscore (_) from the set of valid characters for the protocol, resulting in the inability to correctly parse the connection string for SASL_PLAINTEXT. This bug fix addresses the issue and includes corresponding tests. Reviewers: Andrew Schofield , Luke Chen --- .../org/apache/kafka/common/utils/Utils.java | 2 +- .../apache/kafka/common/utils/UtilsTest.java | 42 +++++++++++-------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/clients/src/main/java/org/apache/kafka/common/utils/Utils.java b/clients/src/main/java/org/apache/kafka/common/utils/Utils.java index 456df3ceb92..a48d6cbd7a3 100644 --- a/clients/src/main/java/org/apache/kafka/common/utils/Utils.java +++ b/clients/src/main/java/org/apache/kafka/common/utils/Utils.java @@ -95,7 +95,7 @@ public final class Utils { // This matches URIs of formats: host:port and protocol://host:port // IPv6 is supported with [ip] pattern - private static final Pattern HOST_PORT_PATTERN = Pattern.compile("^(?:[a-zA-Z][a-zA-Z\\d+-.]*://)?\\[?([0-9a-zA-Z\\-._%:]+)\\]?:([0-9]+)$"); + private static final Pattern HOST_PORT_PATTERN = Pattern.compile("^(?:[0-9a-zA-Z\\-%._]*://)?\\[?([0-9a-zA-Z\\-%._:]*)]?:([0-9]+)"); private static final Pattern VALID_HOST_CHARACTERS = Pattern.compile("([0-9a-zA-Z\\-%._:]*)"); diff --git a/clients/src/test/java/org/apache/kafka/common/utils/UtilsTest.java b/clients/src/test/java/org/apache/kafka/common/utils/UtilsTest.java index 012151dd34e..3f9979592d1 100755 --- a/clients/src/test/java/org/apache/kafka/common/utils/UtilsTest.java +++ b/clients/src/test/java/org/apache/kafka/common/utils/UtilsTest.java @@ -21,6 +21,8 @@ import org.apache.kafka.test.TestUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; import org.junit.jupiter.api.function.Executable; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import org.mockito.stubbing.OngoingStubbing; import java.io.Closeable; @@ -106,31 +108,35 @@ public class UtilsTest { } } - @Test - public void testGetHost() { - // valid + @ParameterizedTest + @CsvSource(value = {"PLAINTEXT", "SASL_PLAINTEXT", "SSL", "SASL_SSL"}) + public void testGetHostValid(String protocol) { + assertEquals("mydomain.com", getHost(protocol + "://mydomain.com:8080")); + assertEquals("MyDomain.com", getHost(protocol + "://MyDomain.com:8080")); + assertEquals("My_Domain.com", getHost(protocol + "://My_Domain.com:8080")); + assertEquals("::1", getHost(protocol + "://[::1]:1234")); + assertEquals("2001:db8:85a3:8d3:1319:8a2e:370:7348", getHost(protocol + "://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:5678")); + assertEquals("2001:DB8:85A3:8D3:1319:8A2E:370:7348", getHost(protocol + "://[2001:DB8:85A3:8D3:1319:8A2E:370:7348]:5678")); + assertEquals("fe80::b1da:69ca:57f7:63d8%3", getHost(protocol + "://[fe80::b1da:69ca:57f7:63d8%3]:5678")); assertEquals("127.0.0.1", getHost("127.0.0.1:8000")); - assertEquals("mydomain.com", getHost("PLAINTEXT://mydomain.com:8080")); - assertEquals("MyDomain.com", getHost("PLAINTEXT://MyDomain.com:8080")); - assertEquals("My_Domain.com", getHost("PLAINTEXT://My_Domain.com:8080")); assertEquals("::1", getHost("[::1]:1234")); - assertEquals("2001:db8:85a3:8d3:1319:8a2e:370:7348", getHost("PLAINTEXT://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:5678")); - assertEquals("2001:DB8:85A3:8D3:1319:8A2E:370:7348", getHost("PLAINTEXT://[2001:DB8:85A3:8D3:1319:8A2E:370:7348]:5678")); - assertEquals("fe80::b1da:69ca:57f7:63d8%3", getHost("PLAINTEXT://[fe80::b1da:69ca:57f7:63d8%3]:5678")); + } - // invalid - assertNull(getHost("PLAINTEXT://mydo)main.com:8080")); - assertNull(getHost("PLAINTEXT://mydo(main.com:8080")); - assertNull(getHost("PLAINTEXT://mydo()main.com:8080")); - assertNull(getHost("PLAINTEXT://mydo(main).com:8080")); + @ParameterizedTest + @CsvSource(value = {"PLAINTEXT", "SASL_PLAINTEXT", "SSL", "SASL_SSL"}) + public void testGetHostInvalid(String protocol) { + assertNull(getHost(protocol + "://mydo)main.com:8080")); + assertNull(getHost(protocol + "://mydo(main.com:8080")); + assertNull(getHost(protocol + "://mydo()main.com:8080")); + assertNull(getHost(protocol + "://mydo(main).com:8080")); + assertNull(getHost(protocol + "://[2001:db)8:85a3:8d3:1319:8a2e:370:7348]:5678")); + assertNull(getHost(protocol + "://[2001:db(8:85a3:8d3:1319:8a2e:370:7348]:5678")); + assertNull(getHost(protocol + "://[2001:db()8:85a3:8d3:1319:8a2e:370:7348]:5678")); + assertNull(getHost(protocol + "://[2001:db(8:85a3:)8d3:1319:8a2e:370:7348]:5678")); assertNull(getHost("ho)st:9092")); assertNull(getHost("ho(st:9092")); assertNull(getHost("ho()st:9092")); assertNull(getHost("ho(st):9092")); - assertNull(getHost("PLAINTEXT://[2001:db)8:85a3:8d3:1319:8a2e:370:7348]:5678")); - assertNull(getHost("PLAINTEXT://[2001:db(8:85a3:8d3:1319:8a2e:370:7348]:5678")); - assertNull(getHost("PLAINTEXT://[2001:db()8:85a3:8d3:1319:8a2e:370:7348]:5678")); - assertNull(getHost("PLAINTEXT://[2001:db(8:85a3:)8d3:1319:8a2e:370:7348]:5678")); } @Test