From 803bd872a42e70a07fd3877fab23cf8840567ce8 Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Sat, 29 Aug 2026 08:24:10 +0200 Subject: [PATCH] http: fast-forward teardown of unread messages When a response finishes and the incoming message was fully received but never read, _dump() no longer goes through resume(): read(0) at EOF schedules the 'end' emission directly, skipping the resume_ tick, the 'resume' emit and the flow() machinery. Reduces the per-request nextTick count of a hello-world HTTP server from 7 to 6 and CPU per request by ~4%. Signed-off-by: Matteo Collina --- lib/_http_incoming.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/_http_incoming.js b/lib/_http_incoming.js index 067a4cda3e39..04695ae640e2 100644 --- a/lib/_http_incoming.js +++ b/lib/_http_incoming.js @@ -512,7 +512,14 @@ IncomingMessage.prototype._dump = function _dump() { // If there is buffered data, it may trigger 'data' events. // Remove 'data' event listeners explicitly. this.removeAllListeners('data'); - this.resume(); + if (this.complete && !this.destroyed && this.readableLength === 0) { + // The message was fully received and never read: there is nothing to + // pull off the wire. Go straight to the 'end' emission instead of + // paying for the resume() and flow() scheduling machinery. + this.read(0); + } else { + this.resume(); + } } };