`text/plain` request bodies are parsed instead of streamed: non-UTF-8 bytes corrupted, bodies over 1 MiB rejected with 413
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 82/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- javascript, node.js
- Área
- backend, networking
Línea de trabajo
Empieza en index.js, alrededor de las líneas 718–719, donde el proxy registra los analizadores del cuerpo, y lee las pruebas de analizadores cercanas. Añade cobertura para cargas text/plain con bytes que no sean UTF-8 y cuerpos que superen el límite predeterminado del cuerpo. Después, registra el analizador necesario y confirma que las pruebas muestran una retransmisión byte por byte sin una respuesta 413.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Prerequisites
- I have written a descriptive issue title
- I have searched existing issues to ensure the bug has not already been reported
Fastify version
5.12.8
Plugin version
@fastify/http-proxy 11.6.6 (also main at ce4d419), @fastify/reply-from 12.8.1
Node.js version
26.13.0
Operating system
Linux
Operating system version (i.e. 20.04, 11.3, 10)
Debian 12
Description
The README says non-JSON payloads are streamed directly to the destination. That holds for text/csv or application/octet-stream, but not for text/plain: Fastify's built-in text/plain parser still runs, because the plugin only overrides application/json and * (index.js lines 718-719). The body is decoded as UTF-8 and re-sent as a string, so a text/plain upload in any other charset is corrupted, and a text/plain upload larger than bodyLimit gets a 413 instead of being streamed.
// repro.mjs
import http from 'node:http';
import Fastify from 'fastify';
import proxy from '@fastify/http-proxy';
// upstream: report how many bytes arrived and the first bytes
http.createServer((req, res) => {
const chunks = [];
req.on('data', (c) => chunks.push(c));
req.on('end', () => {
const b = Buffer.concat(chunks);
res.end(`got ${b.length} bytes: ${b.subarray(0, 6).toString('hex')}`);
});
}).listen(3001);
const app = Fastify();
app.register(proxy, { upstream: 'http://127.0.0.1:3001' });
await app.listen({ port: 3000 });
const send = async (type, body) => {
const r = await fetch('http://127.0.0.1:3000/upload', { method: 'POST', headers: { 'content-type': type }, body });
console.log(type.padEnd(30), `sent ${body.length} bytes: ${body.subarray(0, 6).toString('hex')} ->`, r.status, await r.text());
};
const latin1 = Buffer.from('café crème', 'latin1');
await send('text/plain; charset=iso-8859-1', latin1);
await send('text/csv; charset=iso-8859-1', latin1);
await send('text/plain', Buffer.alloc(2 * 1024 * 1024, 'a'));
await send('application/octet-stream', Buffer.alloc(2 * 1024 * 1024, 'a'));
process.exit(0);
node repro.mjs prints:
text/plain; charset=iso-8859-1 sent 10 bytes: 636166e92063 -> 200 got 14 bytes: 636166efbfbd
text/csv; charset=iso-8859-1 sent 10 bytes: 636166e92063 -> 200 got 10 bytes: 636166e92063
text/plain sent 2097152 bytes: 616161616161 -> 413 {"statusCode":413,"code":"FST_ERR_CTP_BODY_TOO_LARGE","error":"Payload Too Large","message":"Request body is too large"}
application/octet-stream sent 2097152 bytes: 616161616161 -> 200 got 2097152 bytes: 616161616161
Link to code that reproduces the bug
https://gist.github.com/trackoor/a9dc305ecd07ded3018ca5fea688a582
Expected Behavior
text/plain bodies reach the upstream byte for byte, like every other non-JSON type: 10 bytes 636166e92063 in the first line and 200 got 2097152 bytes in the third. Registering bodyParser for text/plain next to application/json should be enough.
Found with a differential-testing tool; the report was drafted with AI assistance and reviewed and edited by me.
Credit: https://ucsbplse.github.io/
- Lenguaje dominante
- JavaScript
- Estrellas
- 394
- Forks
- 105
- Merge medio
- 9 h 34 min
- PR fusionados (30 d)
- 2
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la 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 fastify/fastify-http-proxy
-
reply.fromParameters() drops query params after a second "?"Posiblemente ocupada @RaphaelFakhri la tomó hace 2 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
fastify/fastify-http-proxy#491 ·
Todos los issues de fastify/fastify-http-proxy
Issues similares
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
arfct/timezone.fyi#19 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
tensorflow/tfjs#8754 ·
-
Marketplace time-zone issueAbiertobug main ui
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
openhab/openhab-webui#4671 ·
Los mantenedores suelen responder en 1 día
-
scratch-paint's npm test does not run lint, so CI never lints paint; one lint error is currently in developPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
scratchfoundation/scratch-editor#754 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 96/100
google/site-kit-wp#14102 ·
Los mantenedores suelen responder en 2 días