From a05b226eb5e1c8977df0c7a5fc8b0dca88a80d0f Mon Sep 17 00:00:00 2001 From: Magnus Persson <1431685+magnusp@users.noreply.github.com> Date: Sat, 24 Oct 2026 19:32:02 +0200 Subject: [PATCH] fix(jdbc): ignore unsupported socketTimeout instead of throwing The timeout branch guarded on connectTimeout or socketTimeout but always read connectTimeout, so a URL with only socketTimeout threw NumberFormatException from Long.parseLong(null) at parse time. Take socketTimeout out of the guard so the parameter is ignored like any other unknown parameter. LibsqlClientConfig has no socket timeout field, and mapping it onto the connect timeout would change behavior that callers did not ask for. --- .../magnusp/libsql/jdbc/LibsqlUrlParser.java | 2 +- .../libsql/jdbc/LibsqlUrlParserTest.java | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlUrlParser.java b/libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlUrlParser.java index ed5ee09..fef732b 100644 --- a/libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlUrlParser.java +++ b/libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlUrlParser.java @@ -95,7 +95,7 @@ public static LibsqlClientConfig parse(String url, Properties info) throws SQLEx // Timeouts Duration connectTimeout = LibsqlClientConfig.DEFAULT_CONNECT_TIMEOUT; - if (queryParams.containsKey("connectTimeout") || queryParams.containsKey("socketTimeout")) { + if (queryParams.containsKey("connectTimeout")) { connectTimeout = Duration.ofMillis(Long.parseLong(queryParams.get("connectTimeout"))); } else if (info != null && info.containsKey("connectTimeout")) { connectTimeout = Duration.ofMillis(Long.parseLong(info.getProperty("connectTimeout"))); diff --git a/libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlUrlParserTest.java b/libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlUrlParserTest.java index 8ac8070..458e7b9 100644 --- a/libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlUrlParserTest.java +++ b/libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlUrlParserTest.java @@ -37,6 +37,23 @@ void testParseUrlWithNamespacePathAndQueryParams() throws SQLException { assertThat(config.connectTimeout().toMillis()).isEqualTo(5000); } + @Test + void testIgnoresSocketTimeoutWithoutConnectTimeout() throws SQLException { + String url = "jdbc:libsql:http://localhost:8080/dev/tenant?socketTimeout=5000"; + LibsqlClientConfig config = LibsqlUrlParser.parse(url, new Properties()); + + assertThat(config.url()).isEqualTo("http://localhost:8080/dev/tenant"); + assertThat(config.connectTimeout()).isEqualTo(LibsqlClientConfig.DEFAULT_CONNECT_TIMEOUT); + } + + @Test + void testConnectTimeoutStillWinsAlongsideSocketTimeout() throws SQLException { + String url = "jdbc:libsql:http://localhost:8080/dev/tenant?socketTimeout=5000&connectTimeout=2500"; + LibsqlClientConfig config = LibsqlUrlParser.parse(url, new Properties()); + + assertThat(config.connectTimeout().toMillis()).isEqualTo(2500); + } + @Test void testParseWebSocketUrlKeepsTheSchemeAndPath() throws SQLException { LibsqlClientConfig config = LibsqlUrlParser.parse(