download_file ignores the RFC 6266 filename* Content-Disposition parameter
I maintainer di solito rispondono entro 4 giorni
@rahul05ranjan ci sta già lavorando.
Dal 28/10/2026.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 76/100
Direzione di ricerca
Inizia con fsutil.download_file() e con l’analisi e la sanificazione dei nomi di file esistenti descritte nell’issue; poi trova i relativi test e aggiungi un caso che usa l’header Content-Disposition fornito. Verifica che filename* decodificato abbia la precedenza e venga sanificato, mentre i valori malformati o i set di caratteri sconosciuti ricorrano al fallback specificato.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
fsutil.download_file() only extracts the filename from the basic quoted parameter of Content-Disposition:
filename_pattern = r'filename="(.*)"'
However, many servers (S3, GitHub, browsers-side conventions) send the filename through the extended parameter when it contains non-ASCII characters, per RFC 6266 / RFC 5987:
Content-Disposition: attachment; filename="fallback.txt"; filename*=UTF-8''%E2%82%AC%20rates.txt
RFC 6266 says filename* takes precedence over filename. Today download_file() ignores filename* entirely, so such downloads are saved under a URL-derived name (or a random download-<uuid> name), silently dropping the server-provided filename.
Repro
class MockResponse:
headers = {"content-disposition": "attachment; filename=\"fallback.txt\"; filename*=UTF-8''%E2%82%AC%20rates.txt"}
...
path = fsutil.download_file("https://example.com/file.txt", dirpath=tmp)
# expected: "€ rates.txt" (from filename*)
# actual: "file.txt" (derived from the URL)
Expected behavior
- Parse
filename*=charset'language'percent-encoded-value(parameter name case-insensitive). - Percent-decode the value using the declared charset.
- Give it precedence over the basic
filenameparameter. - Keep the existing path-traversal sanitization (
\//normalization +os.path.basename) on the decoded value, since it comes from an untrusted header — the same hardening that #181 added for the basic parameter. - On an unknown charset or a malformed extended value, fall back to the basic
filenameparameter / URL / random name as before.
Happy to send a PR.
- Lingua principale
- Python
- Stelle
- 268
- Fork
- 22
- Merge medio
- 4g 11h
- PR unite (30g)
- 2
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di fabiocaccamo/python-fsutil
-
Atomic append fails to create a missing fileForse già presa @harbinresearcher l’ha presa 17 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
fabiocaccamo/python-fsutil#201 ·
I maintainer di solito rispondono entro 4 giorni
-
get_unique_name appends to the previous candidate name when a collision triggers a retryForse già presa @rahul05ranjan l’ha presa 2 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 35/100
fabiocaccamo/python-fsutil#206 ·
I maintainer di solito rispondono entro 4 giorni
-
Add `toml` files operation support.Forse di nuovo libera @fabiocaccamo l’ha presa 1337 giorni fa e non c’è nessuna pull request aperta. Apertaenhancement
fabiocaccamo/python-fsutil#42 · 1 assegnatario ·
I maintainer di solito rispondono entro 4 giorni
Tutte le issue di fabiocaccamo/python-fsutil
Issue simili
-
getchaintips leaves out the active tip once a header is staged on it, where Core always lists itAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
btclib-org/btclib-node#2158 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
dbt-msft/dbt-sqlserver#897 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
Gathin23/cleanyourtv#2770 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
vllm-project/vllm#64845 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
dekobon/big-code-analysis#1729 ·
I maintainer di solito rispondono entro 1 giorno