]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
fix: honour the PGCONNECT_TIMEOUT env var
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Wed, 13 Dec 2023 03:55:51 +0000 (04:55 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Wed, 13 Dec 2023 04:00:28 +0000 (05:00 +0100)
docs/news.rst
psycopg/psycopg/conninfo.py
tests/test_conninfo.py

index 55f0ea199dec74709720747e3d8711c680adabc9..51440d0bb55337b2c79b6523fff1460e24d32dee 100644 (file)
@@ -17,6 +17,8 @@ Psycopg 3.1.15 (unreleased)
   :ticket:`#694`).
 - Fix async connection to hosts resolving to multiple IP addresses (regression
   in 3.1.13, :ticket:`#695`).
+- Respect the :envvar:`PGCONNECT_TIMEOUT` environment variable to determine
+  the connection timeout.
 
 
 Current release
index ec36ff09ebf7c80e77511e553eb88422b375547c..9d276ebc0b0bd48f7fbb4254abcaa9e1895aa7f9 100644 (file)
@@ -446,7 +446,9 @@ def timeout_from_conninfo(params: ConnDict) -> int:
     # - at least 2 seconds.
     #
     # See connectDBComplete in fe-connect.c
-    value = params.get("connect_timeout", _DEFAULT_CONNECT_TIMEOUT)
+    value: str | int | None = _get_param(params, "connect_timeout")
+    if value is None:
+        value = _DEFAULT_CONNECT_TIMEOUT
     try:
         timeout = int(value)
     except ValueError:
index 48995dfdbf73f0785305a592300f8b5d0d55153e..7db911236d1a1e6aca93f3cb34113069217be769 100644 (file)
@@ -8,6 +8,7 @@ import psycopg
 from psycopg import ProgrammingError
 from psycopg.conninfo import make_conninfo, conninfo_to_dict, ConnectionInfo
 from psycopg.conninfo import conninfo_attempts, conninfo_attempts_async
+from psycopg.conninfo import timeout_from_conninfo, _DEFAULT_CONNECT_TIMEOUT
 from psycopg._encodings import pg2pyenc
 
 from .fix_crdb import crdb_encoding
@@ -530,6 +531,25 @@ async def test_conninfo_random_async(fake_resolve):
     assert hostaddrs != sorted(hostaddrs)
 
 
+@pytest.mark.parametrize(
+    "conninfo, want, env",
+    [
+        ("", _DEFAULT_CONNECT_TIMEOUT, None),
+        ("host=foo", _DEFAULT_CONNECT_TIMEOUT, None),
+        ("connect_timeout=-1", _DEFAULT_CONNECT_TIMEOUT, None),
+        ("connect_timeout=0", _DEFAULT_CONNECT_TIMEOUT, None),
+        ("connect_timeout=1", 2, None),
+        ("connect_timeout=10", 10, None),
+        ("", 15, {"PGCONNECT_TIMEOUT": "15"}),
+    ],
+)
+def test_timeout(setpgenv, conninfo, want, env):
+    setpgenv(env)
+    params = conninfo_to_dict(conninfo)
+    timeout = timeout_from_conninfo(params)
+    assert timeout == want
+
+
 @pytest.fixture
 async def fake_resolve(monkeypatch):
     fake_hosts = {