diff --git a/lib/fetch/request.js b/lib/fetch/request.js index 37f7c0c969f..c17927ee768 100644 --- a/lib/fetch/request.js +++ b/lib/fetch/request.js @@ -419,16 +419,10 @@ 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) - // } - - this[kState].headersList = new HeadersList([ - ...this[kState].headersList, - ...headers[kHeadersList] - ]) + if (headers.constructor.name === 'Headers') { + for (const [key, val] of headers[kHeadersList] || headers) { + this[kHeaders].append(key, val) + } } else { // 5. Otherwise, fill this’s headers with headers. fillHeaders(this[kState].headersList, headers) @@ -467,8 +461,7 @@ class Request { // not contain `Content-Type`, then append `Content-Type`/Content-Type to // this’s headers. if (contentType && !this[kHeaders].has('content-type')) { - this[kHeaders].set('content-type', contentType) - this[kState].headersList.set('content-type', contentType) + this[kHeaders].append('content-type', contentType) } } diff --git a/test/fetch/request.js b/test/fetch/request.js index e37b395258f..6011c4e28af 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') const { URLSearchParams } = require('url') @@ -294,3 +295,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() +})