diff --git a/lib/dispatcher/client-h2.js b/lib/dispatcher/client-h2.js index d4dc681f94a..9d070958135 100644 --- a/lib/dispatcher/client-h2.js +++ b/lib/dispatcher/client-h2.js @@ -538,25 +538,17 @@ function shouldSendContentLength (method) { return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' } -function writeH2 (client, request) { - const requestTimeout = request.bodyTimeout ?? client[kBodyTimeout] - const session = client[kHTTP2Session] - const { method, path, host, upgrade, expectContinue, signal, protocol, headers: reqHeaders } = request - let { body } = request - - if (upgrade != null && upgrade !== 'websocket') { - util.errorRequest(client, request, new InvalidArgumentError(`Custom upgrade "${upgrade}" not supported over HTTP/2`)) - return false - } - +function buildRequestHeaders (reqHeaders) { const headers = {} + for (let n = 0; n < reqHeaders.length; n += 2) { const key = reqHeaders[n + 0] const val = reqHeaders[n + 1] + const current = headers[key] if (key === 'cookie') { - if (headers[key] != null) { - headers[key] = Array.isArray(headers[key]) ? (headers[key].push(val), headers[key]) : [headers[key], val] + if (current != null) { + headers[key] = Array.isArray(current) ? (current.push(val), current) : [current, val] } else { headers[key] = val } @@ -564,21 +556,32 @@ function writeH2 (client, request) { continue } - if (Array.isArray(val)) { - for (let i = 0; i < val.length; i++) { - if (headers[key]) { - headers[key] += `, ${val[i]}` - } else { - headers[key] = val[i] - } - } - } else if (headers[key]) { - headers[key] += `, ${val}` - } else { - headers[key] = val + if (typeof val === 'string') { + headers[key] = current ? `${current}, ${val}` : val + continue } + + for (let i = 0; i < val.length; i++) { + headers[key] = headers[key] ? `${headers[key]}, ${val[i]}` : val[i] + } + } + + return headers +} + +function writeH2 (client, request) { + const requestTimeout = request.bodyTimeout ?? client[kBodyTimeout] + const session = client[kHTTP2Session] + const { method, path, host, upgrade, expectContinue, signal, protocol, headers: reqHeaders } = request + let { body } = request + + if (upgrade != null && upgrade !== 'websocket') { + util.errorRequest(client, request, new InvalidArgumentError(`Custom upgrade "${upgrade}" not supported over HTTP/2`)) + return false } + const headers = buildRequestHeaders(reqHeaders) + /** @type {import('node:http2').ClientHttp2Stream} */ let stream = null