Reopen of: Problems with cooperation between http and pipeline/"for await"
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- JavaScript
- Estrellas
- 122k
- Forks
- 37.3k
- Merge medio
- 4 d 2 h
- PR fusionados (30 d)
- 283
Descripción
Version
v20.5.1
Platform
Darwin Kernel Version 22.6.0
Subsystem
http
What steps will reproduce the bug?
https://github.com/nodejs/node/issues/38262
https://github.com/nodejs/node/issues/38262#issuecomment-991233190
This often stops after the first iteration:
let http = require("http");
let server = http.createServer(async function(req, res)
{
try
{
let len = 0;
for await (let chunk of req)
{
len += chunk.length;
if(len > 2) throw "payload too large";
}
res.end("ok");
}
catch(err)
{
console.log("server log:", err);
res.end(err);
}
});
(async function()
{
await new Promise(resolve => server.listen(8888, resolve));
let agent = new http.Agent({ keepAlive: true });
let data = Buffer.alloc(1000000);
for(let i = 0; ; i++)
{
console.log(i);
let req = http.request({ port: 8888, method: "post", agent }).end(data);
let res = await new Promise((resolve, reject) => req.on("response", resolve).on("error", reject));
let str = "";
for await (let chunk of res) str += chunk;
console.log(str);
}
}());
How often does it reproduce? Is there a required condition?
Often.
What is the expected behavior? Why is that the expected behavior?
It should continue.
What do you see instead?
0
server log: payload too large
payload too large
1
^C
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.
Línea de trabajo
Comienza ejecutando la reproducción proporcionada con la versión de Node.js indicada y compara su comportamiento con el issue #38262 y el comentario enlazado. Traza el manejo de los iteradores asíncronos de solicitud/respuesta HTTP en torno a for await, el procesamiento de solicitudes rechazadas y el keep-alive agent. Se considera terminado cuando el bucle repetido continúa de forma fiable después de la carga útil sobredimensionada, en lugar de detenerse tras la primera iteración.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- javascript, node.js
- Área
- backend, networking
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Activo
- Claridad
- Bastante claro
- Aptitud para principiantes
- 52/100