Skip to content

Commit

Permalink
fix: parseHeaders should take Record<string, ...>
Browse files Browse the repository at this point in the history
  • Loading branch information
ronag committed May 12, 2024
1 parent 077531a commit c389a23
Showing 1 changed file with 63 additions and 16 deletions.
79 changes: 63 additions & 16 deletions lib/core/util.js
Expand Up @@ -273,28 +273,75 @@ function bufferToLowerCasedHeaderName (value) {
}

/**
* @param {Record<string, string | string[]> | (Buffer | string | (Buffer | string)[])[]} headers
* @param {Record<string, string | string[] | null | undefined> | (Buffer | string | (Buffer | string)[])[]} headers
* @param {Record<string, string | string[]>} [obj]
* @returns {Record<string, string | string[]>}
*/
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()
}
}
}
Expand Down

0 comments on commit c389a23

Please sign in to comment.