Skip to content

Commit

Permalink
[PR #8332/482e6cdf backport][3.9] Add set_content_disposition test (#…
Browse files Browse the repository at this point in the history
…8333)

**This is a backport of PR #8332 as merged into master
(482e6cd).**

Co-authored-by: Oleg A <[email protected]>
  • Loading branch information
patchback[bot] and Olegt0rr authored Apr 15, 2024
1 parent 82fbe64 commit 7eecdff
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 2 deletions.
1 change: 1 addition & 0 deletions CHANGES/8332.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed regression with adding Content-Disposition to form-data part after appending to writer -- by :user:`Dreamsorcerer`/:user:`Olegt0rr`.
7 changes: 5 additions & 2 deletions aiohttp/multipart.py
Original file line number Diff line number Diff line change
Expand Up @@ -848,8 +848,6 @@ def append_payload(self, payload: Payload) -> Payload:
if self._is_form_data:
# https://datatracker.ietf.org/doc/html/rfc7578#section-4.7
# https://datatracker.ietf.org/doc/html/rfc7578#section-4.8
assert CONTENT_DISPOSITION in payload.headers
assert "name=" in payload.headers[CONTENT_DISPOSITION]
assert (
not {CONTENT_ENCODING, CONTENT_LENGTH, CONTENT_TRANSFER_ENCODING}
& payload.headers.keys()
Expand Down Expand Up @@ -930,6 +928,11 @@ def size(self) -> Optional[int]:
async def write(self, writer: Any, close_boundary: bool = True) -> None:
"""Write body."""
for part, encoding, te_encoding in self._parts:
if self._is_form_data:
# https://datatracker.ietf.org/doc/html/rfc7578#section-4.2
assert CONTENT_DISPOSITION in part.headers
assert "name=" in part.headers[CONTENT_DISPOSITION]

await writer.write(b"--" + self._boundary + b"\r\n")
await writer.write(part._binary_headers)

Expand Down
7 changes: 7 additions & 0 deletions tests/test_multipart.py
Original file line number Diff line number Diff line change
Expand Up @@ -1282,6 +1282,13 @@ def test_append_multipart(self, writer) -> None:
part = writer._parts[0][0]
assert part.headers[CONTENT_TYPE] == "test/passed"

async def test_set_content_disposition_after_append(self):
writer = aiohttp.MultipartWriter("form-data")
payload = writer.append("some-data")
payload.set_content_disposition("form-data", name="method")
assert CONTENT_DISPOSITION in payload.headers
assert "name=" in payload.headers[CONTENT_DISPOSITION]

def test_with(self) -> None:
with aiohttp.MultipartWriter(boundary=":") as writer:
writer.append("foo")
Expand Down

0 comments on commit 7eecdff

Please sign in to comment.