download_file ignores the RFC 6266 filename* Content-Disposition parameter
Los mantenedores suelen responder en 4 días
@rahul05ranjan ya está trabajando en esto.
Desde el 28/10/2026.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 76/100
Línea de trabajo
Empieza con fsutil.download_file() y el análisis y saneamiento de nombres de archivo existentes descritos en la incidencia; después, busca sus pruebas y añade un caso que use el encabezado Content-Disposition proporcionado. Comprueba que filename* decodificado tiene prioridad y se sanea, mientras que los valores mal formados o los juegos de caracteres desconocidos recurren a la alternativa especificada.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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.
- Lenguaje dominante
- Python
- Estrellas
- 268
- Forks
- 25
- Merge medio
- 4 d 11 h
- PR fusionados (30 d)
- 2
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Sin guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de fabiocaccamo/python-fsutil
-
Atomic append fails to create a missing filePosiblemente ocupada @harbinresearcher la tomó hace 20 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
fabiocaccamo/python-fsutil#201 ·
Los mantenedores suelen responder en 4 días
-
get_unique_name appends to the previous candidate name when a collision triggers a retryPosiblemente ocupada @rahul05ranjan la tomó hace 5 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 35/100
fabiocaccamo/python-fsutil#206 ·
Los mantenedores suelen responder en 4 días
-
Add `toml` files operation support.Quizá libre de nuevo @fabiocaccamo la tomó hace 1340 días y no hay ningún pull request abierto. Abiertoenhancement
fabiocaccamo/python-fsutil#42 · 1 asignado ·
Los mantenedores suelen responder en 4 días
Todos los issues de fabiocaccamo/python-fsutil
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
earthtojake/text-to-cad#758 ·
Los mantenedores suelen responder en 1 día
-
domain:upgrades enhancement needs-triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
gke-labs/kube-agents#4634 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
agardnerIT/opamp-server-py#116 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
-
enhancement good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
elviskahoro/sdk-python-attio#144 · 1 comentario ·
Los mantenedores suelen responder en 1 día