Stream finished does not always work with http incoming message
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
- Subsystem: http
What steps will reproduce the bug?
The stream.finished never resolves or rejects when applied onto a destroyed incoming message like in example below. It finishes for example when applied on a destroyed file stream. Also it finishes when the line with await new Promise(r => setTimeout(r, 1000)); is commented. This looks really inconsistent.
let http = require("http");
let { finished } = require("stream/promises");
let server = http.createServer(async function(req, res)
{
for await (let chunk of req) break;
await new Promise(r => setTimeout(r, 1000));
console.log("waiting");
await finished(req);
console.log("sending");
res.end();
});
(async function()
{
await new Promise(resolve => server.listen(resolve));
let req = http.request({ port: server.address().port, method: "post" }).end("abc");
try
{
let res = await new Promise((resolve, reject) => req.on("response", resolve).on("error", reject));
await finished(res.resume());
}
catch(e)
{
console.log(e);
}
}());
How often does it reproduce? Is there a required condition?
Always.
What is the expected behavior?
Error: socket hang up
waiting
sending
What do you see instead?
Error: socket hang up
waiting
Additional information
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
Beginne damit, die bereitgestellte http.createServer-Reproduktion unter Node v15.12.0 auszuführen und die Interaktion zwischen der eingehenden Anfrage, der Funktion finished aus stream/promises und dem verzögerten await nachzuverfolgen. Vergleiche das Verhalten der zerstörten Anfrage mit dem im Bericht gezeigten Verhalten des Dateistreams. Fertig ist es, wenn die Reproduktion "sending" erreicht und die erwartete socket hang-up-Ausgabe erzeugt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- javascript
- Bereich
- networking
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Ruhig
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 45/100