Skip to content

Commit 9041e9f

Browse files
authored
fix: mock fetch headers shouldn't be an array (#2080)
1 parent 472c40e commit 9041e9f

File tree

4 files changed

+41
-11
lines changed

4 files changed

+41
-11
lines changed

lib/fetch/headers.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
'use strict'
44

55
const { kHeadersList } = require('../core/symbols')
6-
const { kGuard, kHeadersCaseInsensitive } = require('./symbols')
6+
const { kGuard } = require('./symbols')
77
const { kEnumerableProperty } = require('../core/util')
88
const {
99
makeIterator,
@@ -173,15 +173,16 @@ class HeadersList {
173173
}
174174
}
175175

176-
get [kHeadersCaseInsensitive] () {
177-
/** @type {string[]} */
178-
const flatList = []
176+
get entries () {
177+
const headers = {}
179178

180-
for (const { name, value } of this[kHeadersMap].values()) {
181-
flatList.push(name, value)
179+
if (this[kHeadersMap].size) {
180+
for (const { name, value } of this[kHeadersMap].values()) {
181+
headers[name] = value
182+
}
182183
}
183184

184-
return flatList
185+
return headers
185186
}
186187
}
187188

lib/fetch/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ const {
4242
urlIsHttpHttpsScheme,
4343
urlHasHttpsScheme
4444
} = require('./util')
45-
const { kState, kHeaders, kGuard, kRealm, kHeadersCaseInsensitive } = require('./symbols')
45+
const { kState, kHeaders, kGuard, kRealm } = require('./symbols')
4646
const assert = require('assert')
4747
const { safelyExtractBody } = require('./body')
4848
const {
@@ -1950,7 +1950,7 @@ async function httpNetworkFetch (
19501950
origin: url.origin,
19511951
method: request.method,
19521952
body: fetchParams.controller.dispatcher.isMockActive ? request.body && request.body.source : body,
1953-
headers: request.headersList[kHeadersCaseInsensitive],
1953+
headers: request.headersList.entries,
19541954
maxRedirections: 0,
19551955
upgrade: request.mode === 'websocket' ? 'websocket' : undefined
19561956
},

lib/fetch/symbols.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,5 @@ module.exports = {
66
kSignal: Symbol('signal'),
77
kState: Symbol('state'),
88
kGuard: Symbol('guard'),
9-
kRealm: Symbol('realm'),
10-
kHeadersCaseInsensitive: Symbol('headers case insensitive')
9+
kRealm: Symbol('realm')
1110
}

test/issue-2078.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
'use strict'
2+
3+
const { test, skip } = require('tap')
4+
const { nodeMajor, nodeMinor } = require('../lib/core/util')
5+
const { MockAgent, getGlobalDispatcher, setGlobalDispatcher, fetch } = require('..')
6+
7+
if (nodeMajor < 16 || (nodeMajor === 16 && nodeMinor < 8)) {
8+
skip('fetch is not supported in node < v16.8.0')
9+
process.exit()
10+
}
11+
12+
test('MockPool.reply headers are an object, not an array - issue #2078', async (t) => {
13+
const global = getGlobalDispatcher()
14+
const mockAgent = new MockAgent()
15+
const mockPool = mockAgent.get('http://localhost')
16+
17+
t.teardown(() => setGlobalDispatcher(global))
18+
setGlobalDispatcher(mockAgent)
19+
20+
mockPool.intercept({
21+
path: '/foo',
22+
method: 'GET'
23+
}).reply((options) => {
24+
t.ok(!Array.isArray(options.headers))
25+
26+
return { statusCode: 200 }
27+
})
28+
29+
await t.resolves(fetch('http://localhost/foo'))
30+
})

0 commit comments

Comments
 (0)