Skip to content

Commit

Permalink
Raise TypeError if content is passed a 'dict' instance. (#2495)
Browse files Browse the repository at this point in the history
  • Loading branch information
tomchristie committed Dec 11, 2022
1 parent 563a103 commit a8dd079
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 1 deletion.
6 changes: 5 additions & 1 deletion httpx/_content.py
Expand Up @@ -114,7 +114,11 @@ def encode_content(
headers = {"Content-Length": str(content_length)} if body else {}
return headers, ByteStream(body)

elif isinstance(content, Iterable):
elif isinstance(content, Iterable) and not isinstance(content, dict):
# `not isinstance(content, dict)` is a bit oddly specific, but it
# catches a case that's easy for users to make in error, and would
# otherwise pass through here, like any other bytes-iterable,
# because `dict` happens to be iterable. See issue #2491.
content_length_or_none = peek_filelike_length(content)

if content_length_or_none is None:
Expand Down
3 changes: 3 additions & 0 deletions tests/test_content.py
Expand Up @@ -360,6 +360,9 @@ def test_invalid_argument():
with pytest.raises(TypeError):
httpx.Request(method, url, content=123) # type: ignore

with pytest.raises(TypeError):
httpx.Request(method, url, content={"a": "b"}) # type: ignore


@pytest.mark.asyncio
async def test_multipart_multiple_files_single_input_content():
Expand Down

0 comments on commit a8dd079

Please sign in to comment.