Http client sometimes returns EPIPE when server does not read request body
オープン
まだ誰も着手していません。
http
- 主要言語
- JavaScript
- スター
- 122k
- フォーク
- 37.3k
- 平均マージ
- 4日 2時間
- マージ済み PR(30日)
- 283
説明
- 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).
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
まず、提供された HTTP クライアント/サーバーの再現を Darwin 上で実行し、その動作を Linux と比較します。ペイロードにはソースファイルもテストも指定されていないため、EPIPE に関連する HTTP クライアントのリクエストボディ書き込みパスを追跡し、焦点を絞った回帰テストを特定してください。サーバーがリクエストボディを読み取らない状態で、再現時に EPIPE が発生しなくなれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- javascript, node.js
- 領域
- backend, networking
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 静か
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 42/100