From e6b8934de4a3e37f1ee9291e2af008e965abc917 Mon Sep 17 00:00:00 2001 From: Carlos Fuentes Date: Sun, 10 Sep 2023 02:24:38 +0200 Subject: [PATCH] fix: h2 without body (#2258) * fix: h2 without body * refactor: close writable on non-expected body requests --- lib/client.js | 9 +++++++-- lib/core/request.js | 4 +++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/client.js b/lib/client.js index ebc9a6afc11..50d5ca34ae3 100644 --- a/lib/client.js +++ b/lib/client.js @@ -1687,6 +1687,7 @@ function writeH2 (client, session, request) { // we are already connected, streams are pending, first request // will create a new stream. We trigger a request to create the stream and wait until // `ready` event is triggered + // We disabled endStream to allow the user to write to the stream stream = session.request(headers, { endStream: false, signal }) if (stream.id && !stream.pending) { @@ -1761,17 +1762,21 @@ function writeH2 (client, session, request) { session.ref() + const shouldEndStream = method === 'GET' || method === 'HEAD' if (expectContinue) { headers[HTTP2_HEADER_EXPECT] = '100-continue' /** * @type {import('node:http2').ClientHttp2Stream} */ - stream = session.request(headers, { endStream: false, signal }) + stream = session.request(headers, { endStream: shouldEndStream, signal }) stream.once('continue', writeBodyH2) } else { /** @type {import('node:http2').ClientHttp2Stream} */ - stream = session.request(headers, { endStream: false, signal }) + stream = session.request(headers, { + endStream: shouldEndStream, + signal + }) writeBodyH2() } diff --git a/lib/core/request.js b/lib/core/request.js index 3ddc7fdbe32..e3b0c7b9dbf 100644 --- a/lib/core/request.js +++ b/lib/core/request.js @@ -320,11 +320,13 @@ class Request { static [kHTTP2CopyHeaders] (raw) { const rawHeaders = raw.split('\r\n') - const headers = {} + for (const header of rawHeaders) { const [key, value] = header.split(': ') + if (value == null || value.length === 0) continue + if (headers[key]) headers[key] += `,${value}` else headers[key] = value }