Skip to content

Commit f21c6f2

Browse files
[PR #8335/5a6949da backport][3.9] Add Content-Disposition automatically (#8336)
**This is a backport of PR #8335 as merged into master (5a6949d).** Co-authored-by: Sam Bull <[email protected]>
1 parent 7eecdff commit f21c6f2

File tree

3 files changed

+22
-5
lines changed

3 files changed

+22
-5
lines changed

CHANGES/8335.bugfix.rst

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Added default Content-Disposition in multipart/form-data responses -- by :user:`Dreamsorcerer`.

aiohttp/multipart.py

+4
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,10 @@ def append_payload(self, payload: Payload) -> Payload:
852852
not {CONTENT_ENCODING, CONTENT_LENGTH, CONTENT_TRANSFER_ENCODING}
853853
& payload.headers.keys()
854854
)
855+
# Set default Content-Disposition in case user doesn't create one
856+
if CONTENT_DISPOSITION not in payload.headers:
857+
name = f"section-{len(self._parts)}"
858+
payload.set_content_disposition("form-data", name=name)
855859
else:
856860
# compression
857861
encoding = payload.headers.get(CONTENT_ENCODING, "").lower()

tests/test_multipart.py

+17-5
Original file line numberDiff line numberDiff line change
@@ -1282,12 +1282,24 @@ def test_append_multipart(self, writer) -> None:
12821282
part = writer._parts[0][0]
12831283
assert part.headers[CONTENT_TYPE] == "test/passed"
12841284

1285-
async def test_set_content_disposition_after_append(self):
1285+
def test_set_content_disposition_after_append(self):
12861286
writer = aiohttp.MultipartWriter("form-data")
1287-
payload = writer.append("some-data")
1288-
payload.set_content_disposition("form-data", name="method")
1289-
assert CONTENT_DISPOSITION in payload.headers
1290-
assert "name=" in payload.headers[CONTENT_DISPOSITION]
1287+
part = writer.append("some-data")
1288+
part.set_content_disposition("form-data", name="method")
1289+
assert 'name="method"' in part.headers[CONTENT_DISPOSITION]
1290+
1291+
def test_automatic_content_disposition(self):
1292+
writer = aiohttp.MultipartWriter("form-data")
1293+
writer.append_json(())
1294+
part = payload.StringPayload("foo")
1295+
part.set_content_disposition("form-data", name="second")
1296+
writer.append_payload(part)
1297+
writer.append("foo")
1298+
1299+
disps = tuple(p[0].headers[CONTENT_DISPOSITION] for p in writer._parts)
1300+
assert 'name="section-0"' in disps[0]
1301+
assert 'name="second"' in disps[1]
1302+
assert 'name="section-2"' in disps[2]
12911303

12921304
def test_with(self) -> None:
12931305
with aiohttp.MultipartWriter(boundary=":") as writer:

0 commit comments

Comments
 (0)