From 0ed93de841f81b3a00c06ef20e91fd70751054b0 Mon Sep 17 00:00:00 2001 From: MuckT Date: Thu, 2 Dec 2021 23:33:05 -0800 Subject: [PATCH 1/5] fix: handle duplicate headers --- lib/common.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/common.js b/lib/common.js index 373de6e99..bc26ec200 100644 --- a/lib/common.js +++ b/lib/common.js @@ -192,7 +192,7 @@ function isJSONContent(headers) { /** * Return a new object with all field names of the headers lower-cased. * - * Duplicates throw an error. + * Duplicates take the last value provided. */ function headersFieldNamesToLowerCase(headers) { if (!isPlainObject(headers)) { @@ -202,12 +202,12 @@ function headersFieldNamesToLowerCase(headers) { const lowerCaseHeaders = {} Object.entries(headers).forEach(([fieldName, fieldValue]) => { const key = fieldName.toLowerCase() - if (lowerCaseHeaders[key] !== undefined) { - throw Error( - `Failed to convert header keys to lower case due to field name conflict: ${key}` - ) + const regex = new RegExp(fieldValue, 'i'); + if(fieldValue instanceof RegExp && lowerCaseHeaders[key] === undefined) { + lowerCaseHeaders[key] = fieldValue + } else if (!regex.test(lowerCaseHeaders[key])) { + lowerCaseHeaders[key] = fieldValue } - lowerCaseHeaders[key] = fieldValue }) return lowerCaseHeaders From c7ce87920e8ab589bfb678de731bf2882bf50eec Mon Sep 17 00:00:00 2001 From: MuckT Date: Thu, 2 Dec 2021 23:33:34 -0800 Subject: [PATCH 2/5] test: update test for duplicate headers --- tests/test_common.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/tests/test_common.js b/tests/test_common.js index d51edb499..ddfa888af 100644 --- a/tests/test_common.js +++ b/tests/test_common.js @@ -165,15 +165,17 @@ describe('`headersFieldNamesToLowerCase()`', () => { expect(input).to.deep.equal(inputClone) // assert the input is not mutated }) - it('throws on conflicting keys', () => { - expect(() => - common.headersFieldNamesToLowerCase({ - HoSt: 'example.test', - HOST: 'example.test', - }) - ).to.throw( - 'Failed to convert header keys to lower case due to field name conflict: host' - ) + it('handles duplicates of conflicting keys using last value provided', () => { + const results = common.headersFieldNamesToLowerCase({ + hOsT: 'example.test', + HoSt: 'example.test', + HOST: 'final.example.test', + }) + const expected = { + host: 'final.example.test', + } + + expect(results).to.deep.equal(expected) }) }) From c4e50620966de17438d043c60a6b56b50c44cfb5 Mon Sep 17 00:00:00 2001 From: MuckT Date: Thu, 2 Dec 2021 23:48:43 -0800 Subject: [PATCH 3/5] fix: adjust regex to avoid partial match --- lib/common.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/common.js b/lib/common.js index bc26ec200..f877fcb3c 100644 --- a/lib/common.js +++ b/lib/common.js @@ -202,7 +202,7 @@ function headersFieldNamesToLowerCase(headers) { const lowerCaseHeaders = {} Object.entries(headers).forEach(([fieldName, fieldValue]) => { const key = fieldName.toLowerCase() - const regex = new RegExp(fieldValue, 'i'); + const regex = new RegExp(`^{fieldValue}$`, 'i'); if(fieldValue instanceof RegExp && lowerCaseHeaders[key] === undefined) { lowerCaseHeaders[key] = fieldValue } else if (!regex.test(lowerCaseHeaders[key])) { From 0534b0e535141086f46ef540be2b246faf3168ad Mon Sep 17 00:00:00 2001 From: MuckT Date: Thu, 2 Dec 2021 23:49:04 -0800 Subject: [PATCH 4/5] test: adjust test for partial regex match --- tests/test_common.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_common.js b/tests/test_common.js index ddfa888af..aeb64d1e5 100644 --- a/tests/test_common.js +++ b/tests/test_common.js @@ -170,9 +170,11 @@ describe('`headersFieldNamesToLowerCase()`', () => { hOsT: 'example.test', HoSt: 'example.test', HOST: 'final.example.test', + hosts: 'final.example.test' }) const expected = { host: 'final.example.test', + hosts: 'final.example.test' } expect(results).to.deep.equal(expected) From 4a5a537735d53919cbb630589d6ebf180951a57c Mon Sep 17 00:00:00 2001 From: MuckT Date: Fri, 3 Dec 2021 08:21:07 -0800 Subject: [PATCH 5/5] fix: use field value in template literal --- lib/common.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/common.js b/lib/common.js index f877fcb3c..e4623dc91 100644 --- a/lib/common.js +++ b/lib/common.js @@ -202,7 +202,7 @@ function headersFieldNamesToLowerCase(headers) { const lowerCaseHeaders = {} Object.entries(headers).forEach(([fieldName, fieldValue]) => { const key = fieldName.toLowerCase() - const regex = new RegExp(`^{fieldValue}$`, 'i'); + const regex = new RegExp(`^${fieldValue}$`, 'i'); if(fieldValue instanceof RegExp && lowerCaseHeaders[key] === undefined) { lowerCaseHeaders[key] = fieldValue } else if (!regex.test(lowerCaseHeaders[key])) {