Http client sometimes returns EPIPE when server does not read request body
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- JavaScript
- Sterne
- 122k
- Forks
- 37.3k
- Ø Merge
- 4 T. 2 Std.
- Gemergte PRs (30 T.)
- 283
Beschreibung
- Version: v15.12.0
- Platform: Darwin Kernel Version 20.3.0
What steps will reproduce the bug?
let http = require("http");
let server = http.createServer(async function(req, res)
{
res.end("ok");
});
(async function()
{
await new Promise(resolve => server.listen(resolve));
let buf = Buffer.alloc(50000000);
for(let i = 0; ; i++)
{
let req = http.request({ port: server.address().port, method: "post" }).end(buf);
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(i, "client received:", str);
}
}());
How often does it reproduce? Is there a required condition?
Sometimes. It can take a few thousands of iterations or more.
What is the expected behavior?
No EPIPE.
What do you see instead?
85784 client received: ok
node:internal/process/promises:245
triggerUncaughtException(err, true /* fromPromise */);
^
Error: write EPIPE
at WriteWrap.onWriteComplete [as oncomplete] (node:internal/stream_base_commons:94:16) {
errno: -32,
code: 'EPIPE',
syscall: 'write'
}
Additional information
It does not happen on linux (after more than million iterations).
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Führe zunächst die bereitgestellte Reproduktion für HTTP-Client/Server unter Darwin aus und vergleiche ihr Verhalten mit Linux. Die Payload nennt keine Quelldatei und keinen Test, daher verfolge den Schreibpfad für den Request-Body des HTTP-Clients, der mit EPIPE verbunden ist, und identifiziere einen fokussierten Regressionstest. Erledigt ist die Aufgabe, wenn die Reproduktion kein EPIPE mehr erzeugt, während der Server den Request-Body nicht liest.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- javascript, node.js
- Bereich
- backend, networking
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Ruhig
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 42/100