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 }