This is an automated email from the ASF dual-hosted git repository.
yhu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/beam.git
The following commit(s) were added to refs/heads/master by this push:
new b46a6352ba9 Add HTTPS detection for ClickHouse JDBC URL parsing
(#37635)
b46a6352ba9 is described below
commit b46a6352ba948bd46efd9bd294e1799571fc4a83
Author: Bentsi Leviav <[email protected]>
AuthorDate: Wed Feb 18 17:33:25 2026 +0200
Add HTTPS detection for ClickHouse JDBC URL parsing (#37635)
* support more https situations rather than falling back to http
* fix spotless
---
.../sdk/io/clickhouse/ClickHouseJdbcUrlParser.java | 31 ++++++--
.../io/clickhouse/ClickHouseJdbcUrlParserTest.java | 88 ++++++++++++++++++++++
2 files changed, 111 insertions(+), 8 deletions(-)
diff --git
a/sdks/java/io/clickhouse/src/main/java/org/apache/beam/sdk/io/clickhouse/ClickHouseJdbcUrlParser.java
b/sdks/java/io/clickhouse/src/main/java/org/apache/beam/sdk/io/clickhouse/ClickHouseJdbcUrlParser.java
index 92cd1eaeacd..0e9e46b9f29 100644
---
a/sdks/java/io/clickhouse/src/main/java/org/apache/beam/sdk/io/clickhouse/ClickHouseJdbcUrlParser.java
+++
b/sdks/java/io/clickhouse/src/main/java/org/apache/beam/sdk/io/clickhouse/ClickHouseJdbcUrlParser.java
@@ -117,6 +117,8 @@ class ClickHouseJdbcUrlParser {
/**
* Extracts and normalizes the HTTP/HTTPS URL from a JDBC URL.
*
+ * <p>Automatically detects HTTPS based on port 8443 or ssl=true parameter.
+ *
* @param jdbcUrl the JDBC URL to process
* @return normalized HTTP/HTTPS URL
* @throws IllegalArgumentException if the URL format is invalid
@@ -140,10 +142,16 @@ class ClickHouseJdbcUrlParser {
+ jdbcUrl);
}
- // Check if URL already has a scheme and validate it
- if (actualUrl.toLowerCase().startsWith("http://")
- || actualUrl.toLowerCase().startsWith("https://")) {
- return actualUrl;
+ boolean useHttps = false;
+
+ // Check if port suggests HTTPS (8443 is default HTTPS port for ClickHouse)
+ if (actualUrl.contains(":8443")) {
+ useHttps = true;
+ }
+
+ // Check if ssl=true in query string
+ if (actualUrl.toLowerCase().contains("ssl=true")) {
+ useHttps = true;
}
// Check for invalid schemes before prepending http://
@@ -151,17 +159,24 @@ class ClickHouseJdbcUrlParser {
// Extract the scheme part
int schemeEnd = actualUrl.indexOf("://");
String scheme = actualUrl.substring(0, schemeEnd).toLowerCase();
- if (!scheme.equals("http") && !scheme.equals("https")) {
+
+ if (scheme.equals("http") || scheme.equals("https")) {
+ // If http:// but ssl=true detected, upgrade to https://
+ if (scheme.equals("http") && useHttps) {
+ actualUrl = "https://" + actualUrl.substring(schemeEnd + 3);
+ }
+ return actualUrl;
+ } else {
throw new IllegalArgumentException(
"Invalid scheme in JDBC URL. Expected 'http' or 'https'. Got: " +
scheme);
}
}
- // If URL doesn't start with http:// or https://, assume http://
+ // If URL doesn't start with http:// or https://, add the appropriate
scheme
if (actualUrl.startsWith("//")) {
- actualUrl = "http:" + actualUrl;
+ actualUrl = (useHttps ? "https:" : "http:") + actualUrl;
} else {
- actualUrl = "http://" + actualUrl;
+ actualUrl = (useHttps ? "https://" : "http://") + actualUrl;
}
return actualUrl;
diff --git
a/sdks/java/io/clickhouse/src/test/java/org/apache/beam/sdk/io/clickhouse/ClickHouseJdbcUrlParserTest.java
b/sdks/java/io/clickhouse/src/test/java/org/apache/beam/sdk/io/clickhouse/ClickHouseJdbcUrlParserTest.java
index 4b994522d9b..d80398e9d86 100644
---
a/sdks/java/io/clickhouse/src/test/java/org/apache/beam/sdk/io/clickhouse/ClickHouseJdbcUrlParserTest.java
+++
b/sdks/java/io/clickhouse/src/test/java/org/apache/beam/sdk/io/clickhouse/ClickHouseJdbcUrlParserTest.java
@@ -338,4 +338,92 @@ public class ClickHouseJdbcUrlParserTest {
assertEquals("", props.getProperty("user"));
assertEquals("secret", props.getProperty("password"));
}
+
+ @Test
+ public void testJdbcUrlWithSslParameter() {
+ String jdbcUrl =
"jdbc:clickhouse://localhost:8443/mydb?ssl=true&user=admin";
+ ParsedJdbcUrl parsed = ClickHouseJdbcUrlParser.parse(jdbcUrl);
+
+ assertEquals("https://localhost:8443", parsed.getClickHouseUrl());
+ assertEquals("mydb", parsed.getDatabase());
+ assertEquals("admin", parsed.getProperties().getProperty("user"));
+ assertEquals("true", parsed.getProperties().getProperty("ssl"));
+ }
+
+ @Test
+ public void testJdbcUrlWithPort8443DefaultsToHttps() {
+ String jdbcUrl = "jdbc:clickhouse://myhost:8443/mydb";
+ ParsedJdbcUrl parsed = ClickHouseJdbcUrlParser.parse(jdbcUrl);
+
+ assertEquals("https://myhost:8443", parsed.getClickHouseUrl());
+ assertEquals("mydb", parsed.getDatabase());
+ }
+
+ @Test
+ public void testClickHouseCloudUrl() {
+ String jdbcUrl =
+ "jdbc:clickhouse://someservice.clickhouse.cloud:8443/default?"
+ + "user=default&password=secret&ssl=true&sslmode=NONE";
+ ParsedJdbcUrl parsed = ClickHouseJdbcUrlParser.parse(jdbcUrl);
+
+ assertEquals("https://someservice.clickhouse.cloud:8443",
parsed.getClickHouseUrl());
+ assertEquals("default", parsed.getDatabase());
+ assertEquals("default", parsed.getProperties().getProperty("user"));
+ assertEquals("secret", parsed.getProperties().getProperty("password"));
+ assertEquals("true", parsed.getProperties().getProperty("ssl"));
+ }
+
+ @Test
+ public void testJdbcUrlPort8123DefaultsToHttp() {
+ String jdbcUrl = "jdbc:clickhouse://localhost:8123/mydb";
+ ParsedJdbcUrl parsed = ClickHouseJdbcUrlParser.parse(jdbcUrl);
+
+ assertEquals("http://localhost:8123", parsed.getClickHouseUrl());
+ }
+
+ @Test
+ public void testHttpSchemeUpgradedToHttpsWhenSslTrue() {
+ String jdbcUrl = "jdbc:clickhouse:http://localhost:8443/mydb?ssl=true";
+ ParsedJdbcUrl parsed = ClickHouseJdbcUrlParser.parse(jdbcUrl);
+
+ // Should upgrade http to https because ssl=true
+ assertEquals("https://localhost:8443", parsed.getClickHouseUrl());
+ }
+
+ @Test
+ public void testSslTrueTriggersHttps() {
+ String jdbcUrl = "jdbc:clickhouse://localhost:8123/mydb?ssl=true";
+ ParsedJdbcUrl parsed = ClickHouseJdbcUrlParser.parse(jdbcUrl);
+
+ // Should use https because ssl=true, even though port is 8123
+ assertEquals("https://localhost:8123", parsed.getClickHouseUrl());
+ }
+
+ @Test
+ public void testPort8443TriggersHttps() {
+ String jdbcUrl = "jdbc:clickhouse://localhost:8443/mydb";
+ ParsedJdbcUrl parsed = ClickHouseJdbcUrlParser.parse(jdbcUrl);
+
+ // Should use https because port is 8443
+ assertEquals("https://localhost:8443", parsed.getClickHouseUrl());
+ }
+
+ @Test
+ public void testClickHouseCloudUrlWithSsl() {
+ String jdbcUrl =
+ "jdbc:clickhouse://someservice.clickhouse.cloud:8443/default?"
+ + "user=default&password=secret&ssl=true&sslmode=NONE";
+ ParsedJdbcUrl parsed = ClickHouseJdbcUrlParser.parse(jdbcUrl);
+
+ assertEquals("https://someservice.clickhouse.cloud:8443",
parsed.getClickHouseUrl());
+ assertEquals("default", parsed.getDatabase());
+ }
+
+ @Test
+ public void testExplicitHttpsPreserved() {
+ String jdbcUrl = "jdbc:clickhouse:https://localhost:8443/mydb";
+ ParsedJdbcUrl parsed = ClickHouseJdbcUrlParser.parse(jdbcUrl);
+
+ assertEquals("https://localhost:8443", parsed.getClickHouseUrl());
+ }
}