From bd05e33c6ce8da6ca6bbe9bb3dbd3debba5b6a99 Mon Sep 17 00:00:00 2001 From: Kayvan Zahiri <123409429+Kayvan-Zahiri@users.noreply.github.com> Date: Fri, 23 Oct 2026 15:02:24 -0700 Subject: [PATCH] Preserve IPv6 brackets in remote connection URLs --- sqlalchemy_libsql/libsql.py | 8 +++++--- tests/test_connection_urls.py | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 tests/test_connection_urls.py diff --git a/sqlalchemy_libsql/libsql.py b/sqlalchemy_libsql/libsql.py index 6d569ae..f4f0a88 100644 --- a/sqlalchemy_libsql/libsql.py +++ b/sqlalchemy_libsql/libsql.py @@ -19,12 +19,14 @@ def _build_connection_url(url, query, secure): else: scheme = "http" + host = f"[{url.host}]" if ":" in url.host else url.host + if url.username and url.password: - netloc = f"{url.username}:{url.password}@{url.host}" + netloc = f"{url.username}:{url.password}@{host}" elif url.username: - netloc = f"{url.username}@{url.host}" + netloc = f"{url.username}@{host}" else: - netloc = url.host + netloc = host if url.port: netloc += f":{url.port}" diff --git a/tests/test_connection_urls.py b/tests/test_connection_urls.py new file mode 100644 index 0000000..2463751 --- /dev/null +++ b/tests/test_connection_urls.py @@ -0,0 +1,22 @@ +import pytest +from sqlalchemy import create_engine +from urllib.parse import urlsplit + + +@pytest.mark.parametrize("host", ["::1", "2001:db8::1", "127.0.0.1", "example.com"]) +@pytest.mark.parametrize("secure", [False, True]) +def test_remote_connection_url(host, secure): + authority = f"[{host}]" if ":" in host else host + engine = create_engine( + f"sqlite+libsql://{authority}:8080/database?secure={str(secure).lower()}" + ) + try: + args, options = engine.dialect.create_connect_args(engine.url) + scheme = "https" if secure else "http" + assert args == [f"{scheme}://{authority}:8080/database"] + parsed = urlsplit(args[0]) + assert parsed.hostname == host + assert parsed.port == 8080 + assert options["uri"] is True + finally: + engine.dispose()