]> git.ipfire.org Git - thirdparty/httpx.git/commitdiff
httpx.Timeout must include a default (#1085)
authorTom Christie <tom@tomchristie.com>
Fri, 31 Jul 2020 10:41:53 +0000 (11:41 +0100)
committerGitHub <noreply@github.com>
Fri, 31 Jul 2020 10:41:53 +0000 (11:41 +0100)
* httpx.Timeout must include a default

* Tweak docstring

* Gentle deprecation for mandatory default on httpx.Timeout(...)

Co-authored-by: Florimond Manca <florimond.manca@gmail.com>
httpx/_config.py
tests/test_config.py
tests/test_timeouts.py

index 80dda876d512bc8ece67e1e2bc6a7d34c264c173..f7a185bf0e4c91dfe5a5d9c318f5714d8217517e 100644 (file)
@@ -1,6 +1,7 @@
 import os
 import ssl
 import typing
+import warnings
 from base64 import b64encode
 from pathlib import Path
 
@@ -195,9 +196,9 @@ class Timeout:
 
     **Usage**:
 
-    Timeout()                           # No timeout.
+    Timeout(None)                       # No timeouts.
     Timeout(5.0)                        # 5s timeout on all operations.
-    Timeout(connect_timeout=5.0)        # 5s timeout on connect, no other timeouts.
+    Timeout(None, connect_timeout=5.0)  # 5s timeout on connect, no other timeouts.
     Timeout(5.0, connect_timeout=10.0)  # 10s timeout on connect. 5s timeout elsewhere.
     Timeout(5.0, pool_timeout=None)     # No timeout on acquiring connection from pool.
                                         # 5s timeout elsewhere.
@@ -205,7 +206,7 @@ class Timeout:
 
     def __init__(
         self,
-        timeout: TimeoutTypes = None,
+        timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET,
         *,
         connect_timeout: typing.Union[None, float, UnsetType] = UNSET,
         read_timeout: typing.Union[None, float, UnsetType] = UNSET,
@@ -230,7 +231,25 @@ class Timeout:
             self.read_timeout = timeout[1]
             self.write_timeout = None if len(timeout) < 3 else timeout[2]
             self.pool_timeout = None if len(timeout) < 4 else timeout[3]
+        elif not (
+            isinstance(connect_timeout, UnsetType)
+            or isinstance(read_timeout, UnsetType)
+            or isinstance(write_timeout, UnsetType)
+            or isinstance(pool_timeout, UnsetType)
+        ):
+            self.connect_timeout = connect_timeout
+            self.read_timeout = read_timeout
+            self.write_timeout = write_timeout
+            self.pool_timeout = pool_timeout
         else:
+            if isinstance(timeout, UnsetType):
+                warnings.warn(
+                    "httpx.Timeout must either include a default, or set all "
+                    "four parameters explicitly. Omitting the default argument "
+                    "is deprecated and will raise errors in a future version.",
+                    DeprecationWarning,
+                )
+                timeout = None
             self.connect_timeout = (
                 timeout if isinstance(connect_timeout, UnsetType) else connect_timeout
             )
index d9e68db37ae7a5988469f2bcd28e75ea85b6142c..7dafaf11aa7a995914115d91e7662a35ad6a45d2 100644 (file)
@@ -115,8 +115,15 @@ def test_timeout_eq():
     assert timeout == httpx.Timeout(timeout=5.0)
 
 
+def test_timeout_all_parameters_set():
+    timeout = httpx.Timeout(
+        connect_timeout=5.0, read_timeout=5.0, write_timeout=5.0, pool_timeout=5.0
+    )
+    assert timeout == httpx.Timeout(timeout=5.0)
+
+
 def test_timeout_from_nothing():
-    timeout = httpx.Timeout()
+    timeout = httpx.Timeout(None)
     assert timeout.connect_timeout is None
     assert timeout.read_timeout is None
     assert timeout.write_timeout is None
@@ -125,16 +132,16 @@ def test_timeout_from_nothing():
 
 def test_timeout_from_none():
     timeout = httpx.Timeout(timeout=None)
-    assert timeout == httpx.Timeout()
+    assert timeout == httpx.Timeout(None)
 
 
 def test_timeout_from_one_none_value():
-    timeout = httpx.Timeout(read_timeout=None)
-    assert timeout == httpx.Timeout()
+    timeout = httpx.Timeout(None, read_timeout=None)
+    assert timeout == httpx.Timeout(None)
 
 
 def test_timeout_from_one_value():
-    timeout = httpx.Timeout(read_timeout=5.0)
+    timeout = httpx.Timeout(None, read_timeout=5.0)
     assert timeout == httpx.Timeout(timeout=(None, 5.0, None, None))
 
 
@@ -143,6 +150,12 @@ def test_timeout_from_one_value_and_default():
     assert timeout == httpx.Timeout(timeout=(5.0, 5.0, 5.0, 60.0))
 
 
+def test_timeout_missing_default():
+    with pytest.warns(DeprecationWarning):
+        timeout = httpx.Timeout(pool_timeout=60.0)
+        assert timeout == httpx.Timeout(timeout=(None, None, None, 60.0))
+
+
 def test_timeout_from_tuple():
     timeout = httpx.Timeout(timeout=(5.0, 5.0, 5.0, 5.0))
     assert timeout == httpx.Timeout(timeout=5.0)
@@ -157,7 +170,7 @@ def test_timeout_repr():
     timeout = httpx.Timeout(timeout=5.0)
     assert repr(timeout) == "Timeout(timeout=5.0)"
 
-    timeout = httpx.Timeout(read_timeout=5.0)
+    timeout = httpx.Timeout(None, read_timeout=5.0)
     assert repr(timeout) == (
         "Timeout(connect_timeout=None, read_timeout=5.0, "
         "write_timeout=None, pool_timeout=None)"
index 5084bfaad0393ec238f1eee829915f0113934c22..f748148f7afc8cfa4e457e45b4cb2bdb4b408262 100644 (file)
@@ -5,7 +5,7 @@ import httpx
 
 @pytest.mark.usefixtures("async_environment")
 async def test_read_timeout(server):
-    timeout = httpx.Timeout(read_timeout=1e-6)
+    timeout = httpx.Timeout(None, read_timeout=1e-6)
 
     async with httpx.AsyncClient(timeout=timeout) as client:
         with pytest.raises(httpx.ReadTimeout):
@@ -14,7 +14,7 @@ async def test_read_timeout(server):
 
 @pytest.mark.usefixtures("async_environment")
 async def test_write_timeout(server):
-    timeout = httpx.Timeout(write_timeout=1e-6)
+    timeout = httpx.Timeout(None, write_timeout=1e-6)
 
     async with httpx.AsyncClient(timeout=timeout) as client:
         with pytest.raises(httpx.WriteTimeout):
@@ -24,7 +24,7 @@ async def test_write_timeout(server):
 
 @pytest.mark.usefixtures("async_environment")
 async def test_connect_timeout(server):
-    timeout = httpx.Timeout(connect_timeout=1e-6)
+    timeout = httpx.Timeout(None, connect_timeout=1e-6)
 
     async with httpx.AsyncClient(timeout=timeout) as client:
         with pytest.raises(httpx.ConnectTimeout):
@@ -35,7 +35,7 @@ async def test_connect_timeout(server):
 @pytest.mark.usefixtures("async_environment")
 async def test_pool_timeout(server):
     pool_limits = httpx.PoolLimits(max_connections=1)
-    timeout = httpx.Timeout(pool_timeout=1e-4)
+    timeout = httpx.Timeout(None, pool_timeout=1e-4)
 
     async with httpx.AsyncClient(pool_limits=pool_limits, timeout=timeout) as client:
         async with client.stream("GET", server.url):