This is an automated email from the ASF dual-hosted git repository. zhangliang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push: new fbb1c3b1bb5 Support parse the port in IPv6 jdbcUrl (#35289) (#35524) fbb1c3b1bb5 is described below commit fbb1c3b1bb57d28560d138185b90719ad5fb847d Author: null <466144...@qq.com> AuthorDate: Tue Aug 5 07:50:22 2025 +0800 Support parse the port in IPv6 jdbcUrl (#35289) (#35524) --- .../core/connector/url/StandardJdbcUrlParser.java | 32 ++++++++++++++-------- .../connector/url/StandardJdbcUrlParserTest.java | 9 ++++++ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/connector/url/StandardJdbcUrlParser.java b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/connector/url/StandardJdbcUrlParser.java index bc919048aee..7a7bc23cd3d 100644 --- a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/connector/url/StandardJdbcUrlParser.java +++ b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/connector/url/StandardJdbcUrlParser.java @@ -22,6 +22,7 @@ import com.google.common.base.Strings; import org.apache.shardingsphere.infra.database.core.exception.UnrecognizedDatabaseURLException; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; +import java.util.Optional; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -47,6 +48,16 @@ public final class StandardJdbcUrlParser { private static final String QUERY_GROUP_KEY = "query"; + private static final String HOST_PORT_PATTERN = "((?<hostname>[\\w-.+%]+)|(\\[(?<ipv6hostname>[^]]+)]))\\s*(:\\s*(?<port>\\d+))?"; + + private static final Pattern HOST_PORT_PATTERN_PATTERN = Pattern.compile(HOST_PORT_PATTERN); + + private static final String HOSTNAME_GROUP_KEY = "hostname"; + + private static final String IPV6_HOSTNAME_GROUP_KEY = "ipv6hostname"; + + private static final String PORT_GROUP_KEY = "port"; + /** * Parse JDBC URL. * @@ -56,24 +67,21 @@ public final class StandardJdbcUrlParser { public JdbcUrl parse(final String jdbcUrl) { Matcher matcher = CONNECTION_URL_PATTERN.matcher(jdbcUrl); ShardingSpherePreconditions.checkState(matcher.matches(), () -> new UnrecognizedDatabaseURLException(jdbcUrl, CONNECTION_URL_PATTERN.pattern().replaceAll("%", "%%"))); + String authority = matcher.group(AUTHORITY_GROUP_KEY); ShardingSpherePreconditions.checkNotNull(authority, () -> new UnrecognizedDatabaseURLException(jdbcUrl, CONNECTION_URL_PATTERN.pattern().replaceAll("%", "%%"))); - return new JdbcUrl(parseHostname(authority), parsePort(authority), matcher.group(PATH_GROUP_KEY), parseQueryProperties(matcher.group(QUERY_GROUP_KEY))); + + Matcher hostMatcher = HOST_PORT_PATTERN_PATTERN.matcher(authority); + ShardingSpherePreconditions.checkState(hostMatcher.find(), () -> new UnrecognizedDatabaseURLException(jdbcUrl, CONNECTION_URL_PATTERN.pattern().replaceAll("%", "%%"))); + return new JdbcUrl(parseHostname(hostMatcher), parsePort(hostMatcher), matcher.group(PATH_GROUP_KEY), parseQueryProperties(matcher.group(QUERY_GROUP_KEY))); } - private String parseHostname(final String authority) { - return authority.contains(":") ? authority.split(":")[0] : authority; + private String parseHostname(final Matcher hostMatcher) { + return Optional.ofNullable(hostMatcher.group(IPV6_HOSTNAME_GROUP_KEY)).orElse(hostMatcher.group(HOSTNAME_GROUP_KEY)); } - private int parsePort(final String authority) { - if (!authority.contains(":")) { - return -1; - } - String port = authority.split(":")[1]; - if (port.contains(",")) { - port = port.split(",")[0]; - } - return Integer.parseInt(port); + private int parsePort(final Matcher hostMatcher) { + return Optional.ofNullable(hostMatcher.group(PORT_GROUP_KEY)).map(Integer::parseInt).orElse(-1); } /** diff --git a/infra/database/core/src/test/java/org/apache/shardingsphere/infra/database/core/connector/url/StandardJdbcUrlParserTest.java b/infra/database/core/src/test/java/org/apache/shardingsphere/infra/database/core/connector/url/StandardJdbcUrlParserTest.java index 9abd9d02747..b4cedfe61e2 100644 --- a/infra/database/core/src/test/java/org/apache/shardingsphere/infra/database/core/connector/url/StandardJdbcUrlParserTest.java +++ b/infra/database/core/src/test/java/org/apache/shardingsphere/infra/database/core/connector/url/StandardJdbcUrlParserTest.java @@ -81,4 +81,13 @@ class StandardJdbcUrlParserTest { void assertParseIncorrectURL() { assertThrows(UnrecognizedDatabaseURLException.class, () -> new StandardJdbcUrlParser().parse("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL")); } + + @Test + void assertParseMySQLJdbcUrlWithIPV6() { + JdbcUrl actual = new StandardJdbcUrlParser().parse("jdbc:mysql://[fe80::d114:22b3:a0d9:2b3]:3306/db_test"); + assertThat(actual.getHostname(), is("fe80::d114:22b3:a0d9:2b3")); + assertThat(actual.getPort(), is(3306)); + assertThat(actual.getDatabase(), is("db_test")); + assertTrue(actual.getQueryProperties().isEmpty()); + } }