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 <florimond.manca@gmail.com>
This commit is contained in:
Dima Boger 2020-03-17 00:34:50 +03:00 committed by GitHub
parent 43ec09c3cb
commit 430285f55b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 2 deletions

View File

@ -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)

View File

@ -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)