From 63de6d200b9b04d9e0782de84ff63f7265c0d433 Mon Sep 17 00:00:00 2001 From: Khafra <42794878+KhafraDev@users.noreply.github.com> Date: Mon, 2 May 2022 14:21:37 -0400 Subject: [PATCH 1/4] fix(Request): allow passing Headers instance to init.headers --- lib/fetch/request.js | 7 +++---- test/fetch/request.js | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/lib/fetch/request.js b/lib/fetch/request.js index 24210e59044..ee7563cc9da 100644 --- a/lib/fetch/request.js +++ b/lib/fetch/request.js @@ -420,10 +420,9 @@ class Request { // 4. If headers is a Headers object, then for each header in its header // list, append header’s name/header’s value to this’s headers. if (headers instanceof Headers) { - // TODO (fix): Why doesn't this work? - // for (const [key, val] of headers[kHeadersList]) { - // this[kHeaders].append(key, val) - // } + for (const [key, val] of headers) { + this[kHeaders].append(key, val) + } this[kState].headersList = new HeadersList([ ...this[kState].headersList, diff --git a/test/fetch/request.js b/test/fetch/request.js index 5c84f754150..c2ab7fab200 100644 --- a/test/fetch/request.js +++ b/test/fetch/request.js @@ -4,7 +4,8 @@ const { test } = require('tap') const { - Request + Request, + Headers } = require('../../') const { kState } = require('../../lib/fetch/symbols.js') @@ -272,3 +273,35 @@ test('post aborted signal cloned', t => { }) ac.abort() }) + +test('Passing headers in init', (t) => { + // https://github.com/nodejs/undici/issues/1400 + t.test('Headers instance', (t) => { + const req = new Request('http://localhost', { + headers: new Headers({ key: 'value' }) + }) + + t.equal(req.headers.get('key'), 'value') + t.end() + }) + + t.test('key:value object', (t) => { + const req = new Request('http://localhost', { + headers: { key: 'value' } + }) + + t.equal(req.headers.get('key'), 'value') + t.end() + }) + + t.test('[key, value][]', (t) => { + const req = new Request('http://localhost', { + headers: [['key', 'value']] + }) + + t.equal(req.headers.get('key'), 'value') + t.end() + }) + + t.end() +}) From 2569544a67c30d1e74177c51b2105a4181f09c74 Mon Sep 17 00:00:00 2001 From: Khafra <42794878+KhafraDev@users.noreply.github.com> Date: Mon, 2 May 2022 14:28:14 -0400 Subject: [PATCH 2/4] fix(Request): remove unnecessary condition --- lib/fetch/request.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/fetch/request.js b/lib/fetch/request.js index ee7563cc9da..25395c18516 100644 --- a/lib/fetch/request.js +++ b/lib/fetch/request.js @@ -423,11 +423,6 @@ class Request { for (const [key, val] of headers) { this[kHeaders].append(key, val) } - - this[kState].headersList = new HeadersList([ - ...this[kState].headersList, - ...headers[kHeadersList] - ]) } else { // 5. Otherwise, fill this’s headers with headers. fillHeaders(this[kState].headersList, headers) From d19f7567acbbc322778678b8e9b46aa2cd4b2f38 Mon Sep 17 00:00:00 2001 From: Khafra <42794878+KhafraDev@users.noreply.github.com> Date: Mon, 2 May 2022 14:53:34 -0400 Subject: [PATCH 3/4] test: fix node-fetch test failures --- lib/fetch/request.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/fetch/request.js b/lib/fetch/request.js index 25395c18516..9993b81d2d6 100644 --- a/lib/fetch/request.js +++ b/lib/fetch/request.js @@ -419,10 +419,12 @@ class Request { // 4. If headers is a Headers object, then for each header in its header // list, append header’s name/header’s value to this’s headers. - if (headers instanceof Headers) { + if (headers.constructor.name === 'Headers') { for (const [key, val] of headers) { this[kHeaders].append(key, val) } + + this[kState].headersList = headers[kHeadersList] } else { // 5. Otherwise, fill this’s headers with headers. fillHeaders(this[kState].headersList, headers) From 24162cc92572f89623f916df0c8966447d29e361 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Sun, 8 May 2022 22:29:50 +0300 Subject: [PATCH 4/4] fixup --- lib/fetch/request.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/fetch/request.js b/lib/fetch/request.js index 9993b81d2d6..c17927ee768 100644 --- a/lib/fetch/request.js +++ b/lib/fetch/request.js @@ -420,11 +420,9 @@ class Request { // 4. If headers is a Headers object, then for each header in its header // list, append header’s name/header’s value to this’s headers. if (headers.constructor.name === 'Headers') { - for (const [key, val] of headers) { + for (const [key, val] of headers[kHeadersList] || headers) { this[kHeaders].append(key, val) } - - this[kState].headersList = headers[kHeadersList] } else { // 5. Otherwise, fill this’s headers with headers. fillHeaders(this[kState].headersList, headers) @@ -464,7 +462,6 @@ class Request { // this’s headers. if (contentType && !this[kHeaders].has('content-type')) { this[kHeaders].append('content-type', contentType) - this[kState].headersList.append('content-type', contentType) } }