diff --git a/httpx/_utils.py b/httpx/_utils.py index 1f64deedcd..1e1570ee7f 100644 --- a/httpx/_utils.py +++ b/httpx/_utils.py @@ -67,7 +67,11 @@ def primitive_value_to_str(value: "PrimitiveData") -> str: return "false" elif value is None: return "" - return str(value) + elif isinstance(value, (str, float, int)): + return str(value) + raise TypeError( + f"Expected str, int, float, bool, or None. Got {type(value).__name__!r}." + ) def is_known_encoding(encoding: str) -> bool: diff --git a/tests/models/test_queryparams.py b/tests/models/test_queryparams.py index 29b2ca634d..cbb487bbc6 100644 --- a/tests/models/test_queryparams.py +++ b/tests/models/test_queryparams.py @@ -87,6 +87,13 @@ def test_empty_query_params(): assert str(q) == "a=" +def test_invalid_query_params(): + with pytest.raises( + TypeError, match=r"Expected str, int, float, bool, or None. Got 'bytes'." + ): + httpx.QueryParams({"a": b"bytes"}) + + def test_queryparam_update_is_hard_deprecated(): q = httpx.QueryParams("a=123") with pytest.raises(RuntimeError):