Skip to content

Commit ac87e2a

Browse files
zhanghanduoclaude
andcommitted
fix(download): fall back to filename when filename* decodes empty
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 86bf0e1 commit ac87e2a

2 files changed

Lines changed: 12 additions & 4 deletions

File tree

‎plugins/tools/_download_runner.py‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -267,17 +267,21 @@ def _preflight(
267267

268268

269269
def _header_filename(headers: email.message.Message) -> str:
270+
extended = ""
270271
fallback = ""
271272
for name, value in headers.get_params(header="content-disposition", failobj=[]):
272273
if name != "filename":
273274
continue
274275
# The parser represents filename* as an RFC 2231 tuple. Prefer it
275-
# over the ordinary filename, regardless of parameter order.
276+
# over the ordinary filename, regardless of parameter order, but only
277+
# when it decodes to something usable: an empty filename* must not
278+
# discard a valid ordinary filename.
276279
if isinstance(value, tuple):
277-
return email.utils.collapse_rfc2231_value(value).strip()
278-
if not fallback:
280+
if not extended:
281+
extended = email.utils.collapse_rfc2231_value(value).strip()
282+
elif not fallback:
279283
fallback = value.strip()
280-
return fallback
284+
return extended or fallback
281285

282286

283287
def _safe_filename(candidate: str) -> str:

‎tests/test_download_filenames.py‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
'attachment; filename*=UTF-8\'\'actual.pdf; filename="fallback.txt"',
2828
"actual.pdf",
2929
),
30+
('attachment; filename="paper.pdf"; filename*=UTF-8\'\'', "paper.pdf"),
31+
("attachment; filename*=UTF-8''; filename=\"paper.pdf\"", "paper.pdf"),
32+
("attachment; filename*=UTF-8''%20%20; filename=\"paper.pdf\"", "paper.pdf"),
3033
("attachment", ""),
3134
],
3235
)
@@ -50,6 +53,7 @@ def test_response_filename(disposition: str, expected: str) -> None:
5053
("", 'attachment; filename="../../outside.pdf"', "outside.pdf"),
5154
("", "attachment; filename*=UTF-8''..%2Foutside.pdf", "outside.pdf"),
5255
("", "attachment", "url name.pdf"),
56+
("", 'attachment; filename="paper.pdf"; filename*=UTF-8\'\'', "paper.pdf"),
5357
("", "", "url name.pdf"),
5458
("chosen.pdf", 'attachment; filename="report;final.pdf"', "chosen.pdf"),
5559
],

0 commit comments

Comments
 (0)