From: Dima Boger Date: Mon, 16 Mar 2020 21:34:50 +0000 (+0300) Subject: Fix multipart edge cases with `data={}` and/or `files={}` (#861) X-Git-Tag: 0.12.1~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=430285f55be7dda017e6b9d710c5e93f26efc67b;p=thirdparty%2Fhttpx.git Fix multipart edge cases with `data={}` and/or `files={}` (#861) * Add reproducible test example for empty multipart * Possible fix for empty combination of files/data * Return bytestream with empty data/files * Remove content-length in test Co-authored-by: florimondmanca --- diff --git a/httpx/_content_streams.py b/httpx/_content_streams.py index 5f3237e1..afffed34 100644 --- a/httpx/_content_streams.py +++ b/httpx/_content_streams.py @@ -323,7 +323,7 @@ def encode( Handles encoding the given `data`, `files`, and `json`, returning a `ContentStream` implementation. """ - if data is None: + if not data: if json is not None: return JSONStream(json=json) elif files: @@ -331,7 +331,7 @@ def encode( else: return ByteStream(body=b"") elif isinstance(data, dict): - if files is not None: + if files: return MultipartStream(data=data, files=files, boundary=boundary) else: return URLEncodedStream(data=data) diff --git a/tests/test_content_streams.py b/tests/test_content_streams.py index 6aa91f40..c5eb961d 100644 --- a/tests/test_content_streams.py +++ b/tests/test_content_streams.py @@ -189,6 +189,18 @@ async def test_multipart_data_and_files_content(): ) +@pytest.mark.asyncio +async def test_empty_request(): + stream = encode(data={}, files={}) + sync_content = b"".join([part for part in stream]) + async_content = b"".join([part async for part in stream]) + + assert stream.can_replay() + assert stream.get_headers() == {} + assert sync_content == b"" + assert async_content == b"" + + def test_invalid_argument(): with pytest.raises(TypeError): encode(123)