From c389a233e499b3e6a02ba9962e9c02886be5f21e Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Fri, 10 May 2024 21:32:32 +0200 Subject: [PATCH] fix: parseHeaders should take Record --- lib/core/util.js | 79 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 16 deletions(-) diff --git a/lib/core/util.js b/lib/core/util.js index 2bad24df2f6..b06e2f0535b 100644 --- a/lib/core/util.js +++ b/lib/core/util.js @@ -273,28 +273,75 @@ function bufferToLowerCasedHeaderName (value) { } /** - * @param {Record | (Buffer | string | (Buffer | string)[])[]} headers + * @param {Record | (Buffer | string | (Buffer | string)[])[]} headers * @param {Record} [obj] * @returns {Record} */ function parseHeaders (headers, obj) { - if (obj === undefined) obj = {} - for (let i = 0; i < headers.length; i += 2) { - const key = headerNameToString(headers[i]) - let val = obj[key] - - if (val) { - if (typeof val === 'string') { - val = [val] - obj[key] = val + if (obj == null) { + obj = {} + } else { + // TODO (fix): assert obj values? + } + + assert(typeof obj === 'object' && obj !== null, 'headers must be an object') + + if (Array.isArray(headers)) { + for (let i = 0; i < headers.length; i += 2) { + const key2 = headers[i] + const val2 = headers[i + 1] + + // TODO (fix): assert key2 type? + // TODO (fix): assert val2 type? + + if (!val2) { + continue } - val.push(headers[i + 1].toString('utf8')) - } else { - const headersValue = headers[i + 1] - if (typeof headersValue === 'string') { - obj[key] = headersValue + + const key = headerNameToString(key2) + let val = obj[key] + + if (val) { + if (typeof val === 'string') { + val = [val] + obj[key] = val + } + + if (Array.isArray(val2)) { + val.push(...val2.map(x => x.toString())) + } else { + val.push(val2.toString()) + } } else { - obj[key] = Array.isArray(headersValue) ? headersValue.map(x => x.toString('utf8')) : headersValue.toString('utf8') + obj[key] = Array.isArray(val2) ? val2.map(x => x.toString()) : val2.toString() + } + } + } else if (typeof headers === 'object' && headers !== null) { + for (const key2 of Object.keys(headers)) { + const val2 = headers[key2] + + // TODO (fix): assert key2 type? + // TODO (fix): assert val2 type? + + if (!val2) { + continue + } + + const key = headerNameToString(key2) + let val = obj[key] + + if (val) { + if (typeof val === 'string') { + val = [val] + obj[key] = val + } + if (Array.isArray(val2)) { + val.push(...val2.map(x => x.toString())) + } else { + val.push(val2.toString()) + } + } else if (val2 != null) { + obj[key] = Array.isArray(val2) ? val2.map(x => x.toString()) : val2.toString() } } }