From f7a4ee21d5d62e472b33cbadf351467b19776a3c Mon Sep 17 00:00:00 2001 From: Dmitriy Fedotov Date: Fri, 6 Mar 2026 23:50:51 +0200 Subject: [PATCH] fix(http): closing detached http2 session on timeout (#7457) Co-authored-by: Dmitriy Mozgovoy --- lib/adapters/http.js | 3 +++ test/unit/adapters/http.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/lib/adapters/http.js b/lib/adapters/http.js index 20ba3cf8..ad52b7e6 100755 --- a/lib/adapters/http.js +++ b/lib/adapters/http.js @@ -108,6 +108,9 @@ class Http2Sessions { } else { entries.splice(i, 1); } + if (!session.closed) { + session.close(); + } return; } } diff --git a/test/unit/adapters/http.js b/test/unit/adapters/http.js index 77bbe495..dfdc3b49 100644 --- a/test/unit/adapters/http.js +++ b/test/unit/adapters/http.js @@ -3045,6 +3045,37 @@ describe('supports http with nodejs', function () { assert.strictEqual(data1, 'OK'); assert.strictEqual(data2, 'OK'); }); + + it('should close connection after sessionTimeout ends', async () => { + server = await startHTTPServer( + (req, res) => { + setTimeout(() => res.end('OK'), 100); + }, + { + useHTTP2: true, + } + ); + + const response = await http2Axios.get(LOCAL_SERVER_URL, { + responseType: 'stream', + http2Options: { + sessionTimeout: 1000, + }, + }); + + assert.strictEqual(response.data.session.closed, false); + + let sessionClosed = false; + response.data.session.once('close', () => { + sessionClosed = true; + }); + + const data = await getStream(response.data); + assert.strictEqual(data, 'OK'); + + await setTimeoutAsync(1100); + assert.strictEqual(sessionClosed, true); + }); }); });