From 57781bfd78ac14bdefb4e9e62df73ebfdd767d53 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Wed, 13 Dec 2023 04:55:51 +0100 Subject: [PATCH] fix: honour the PGCONNECT_TIMEOUT env var --- docs/news.rst | 2 ++ psycopg/psycopg/conninfo.py | 4 +++- tests/test_conninfo.py | 20 ++++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/docs/news.rst b/docs/news.rst index 55f0ea199..51440d0bb 100644 --- a/docs/news.rst +++ b/docs/news.rst @@ -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 diff --git a/psycopg/psycopg/conninfo.py b/psycopg/psycopg/conninfo.py index ec36ff09e..9d276ebc0 100644 --- a/psycopg/psycopg/conninfo.py +++ b/psycopg/psycopg/conninfo.py @@ -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: diff --git a/tests/test_conninfo.py b/tests/test_conninfo.py index 48995dfdb..7db911236 100644 --- a/tests/test_conninfo.py +++ b/tests/test_conninfo.py @@ -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 = { -- 2.47.2