`Base64Decoder` raises `DecodeError` on line-wrapped (MIME-style) base64
Los mantenedores suelen responder en 1 día
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 25/100
Línea de trabajo
Start by reading Base64Decoder.write() and reproduce the failure with the provided CRLF example, then try split writes and base64.encodebytes data in small chunks. A regression test should show that MIME-wrapped input decodes to the expected bytes regardless of line breaks or chunk boundaries; pull request #341 already submits a fix.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Base64Decoder.write() slices the input to a multiple of 4 bytes before decoding, but it counts line breaks and spaces as base64 characters. Standard base64 as used in MIME (RFC 2045) is wrapped with CRLF or LF, so any quartet that straddles a line break is miscounted and decoding fails. The result also depends on how the stream is chunked.
Reproduction
from io import BytesIO
from python_multipart.decoders import Base64Decoder
out = BytesIO()
d = Base64Decoder(out)
d.write(b"Zm9v\r\nYmFy") # DecodeError
d.finalize()
Expected: b"foobar", which is what base64.b64decode(b"Zm9v\r\nYmFy") returns.
Split writes fail the same way:
d.write(b"Zm9v\r")
d.write(b"\nYmFy") # DecodeError
base64.encodebytes(bytes(range(200))) (76-character lines) written in chunks of 10, 7 or 1 bytes also raises DecodeError.
Cause
write() computes decode_len = (len(data) // 4) * 4 on data that still contains \r, \n, space and tab. b64decode() then discards those bytes (it is not called with validate=True), leaving a slice that is not a multiple of 4, and raises "Incorrect padding".
Version: python-multipart 0.0.32, main at 51ff1a4, Python 3.13.
Fix
A fix with a regression test is submitted in #341.
- Lenguaje dominante
- Python
- Estrellas
- 537
- Forks
- 104
- Merge medio
- 3 h
- PR fusionados (30 d)
- 4
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
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 Kludex/python-multipart
-
Add streaming field limits to `FormParser`Posiblemente ocupada @Kludex la tomó hace 19 días. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 30/100
Kludex/python-multipart#332 ·
Los mantenedores suelen responder en 1 día
-
Clarify or handle non-Latin-1 str input in parse_options_headerPosiblemente ocupada @gyanu2507 la tomó hace 61 días. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 42/100
Kludex/python-multipart#319 ·
Los mantenedores suelen responder en 1 día
-
How to set FormParser MAX_BODY_SIZE, MAX_MEMORY_FILE_SIZE?Posiblemente ocupada @dokson la tomó hace 139 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 35/100
Kludex/python-multipart#201 · 1 comentario · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
Skip header area?Posiblemente ocupada @Kludex la tomó hace 196 días. Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 48/100
Kludex/python-multipart#59 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
Failing to parse non-standard line breaksPosiblemente ocupada @dokson la tomó hace 139 días. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 32/100
Kludex/python-multipart#31 · 4 comentarios · 4 reacciones ·
Los mantenedores suelen responder en 1 día
Todos los issues de Kludex/python-multipart
Issues similares
-
Python Volcengine provider returns failures instead of raising themPosiblemente ocupada @Ricardo-M-L la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 79/100
agent-infra/sandbox#248 ·
-
Textractor leaves empty temporary files when remote retrieval failsPosiblemente ocupada @HuaTNA la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
Los mantenedores suelen responder en 1 día
-
test(bm_generation): pin the learning parameters and CPU sync shortcutPosiblemente ocupada @iloveeyjafjalla la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
qboson/kaiwu-pytorch-plugin#1341 ·
Los mantenedores suelen responder en 2 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
elder-plinius/V3R1T4S#625 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
foxglove/mcap#1907 · 1 comentario ·
Los mantenedores suelen responder en 1 día