nodejs / nodejs/node

Http client sometimes returns EPIPE when server does not read request body

オープン
#38,467 コメント 5 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

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).

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

まず、提供された HTTP クライアント/サーバーの再現を Darwin 上で実行し、その動作を Linux と比較します。ペイロードにはソースファイルもテストも指定されていないため、EPIPE に関連する HTTP クライアントのリクエストボディ書き込みパスを追跡し、焦点を絞った回帰テストを特定してください。サーバーがリクエストボディを読み取らない状態で、再現時に EPIPE が発生しなくなれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
javascript, node.js
領域
backend, networking
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
静か
明瞭さ
おおむね明確
初心者へのやさしさ
42/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。