Skip to content

Commit df1e0c1

Browse files
authored
add dispatcher option to Request (nodejs#2831)
1 parent 669a924 commit df1e0c1

File tree

8 files changed

+49
-15
lines changed

8 files changed

+49
-15
lines changed

lib/web/cache/cache.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ const { kState } = require('../fetch/symbols')
1010
const { fetching } = require('../fetch/index')
1111
const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = require('../fetch/util')
1212
const assert = require('node:assert')
13-
const { getGlobalDispatcher } = require('../../global')
1413

1514
/**
1615
* @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation
@@ -150,7 +149,6 @@ class Cache {
150149
// 5.7
151150
fetchControllers.push(fetching({
152151
request: r,
153-
dispatcher: getGlobalDispatcher(),
154152
processResponse (response) {
155153
// 1.
156154
if (response.type === 'error' || response.status === 206 || response.status < 200 || response.status > 299) {

lib/web/eventsource/eventsource.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ const { EventSourceStream } = require('./eventsource-stream')
99
const { parseMIMEType } = require('../fetch/dataURL')
1010
const { MessageEvent } = require('../websocket/events')
1111
const { isNetworkError } = require('../fetch/response')
12-
const { getGlobalDispatcher } = require('../../global')
1312
const { delay } = require('./util')
1413

1514
let experimentalWarned = false
@@ -316,10 +315,7 @@ class EventSource extends EventTarget {
316315
})
317316
}
318317

319-
this.#controller = fetching({
320-
...fetchParam,
321-
dispatcher: getGlobalDispatcher()
322-
})
318+
this.#controller = fetching(fetchParam)
323319
}
324320

325321
/**

lib/web/fetch/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ const {
4747
createInflate,
4848
extractMimeType
4949
} = require('./util')
50-
const { kState } = require('./symbols')
50+
const { kState, kDispatcher } = require('./symbols')
5151
const assert = require('node:assert')
5252
const { safelyExtractBody, extractBody } = require('./body')
5353
const {
@@ -239,7 +239,7 @@ function fetch (input, init = undefined) {
239239
request,
240240
processResponseEndOfBody: handleFetchDone,
241241
processResponse,
242-
dispatcher: init?.dispatcher ?? getGlobalDispatcher() // undici
242+
dispatcher: requestObject[kDispatcher] // undici
243243
})
244244

245245
// 14. Return p.
@@ -361,7 +361,7 @@ function fetching ({
361361
processResponseEndOfBody,
362362
processResponseConsumeBody,
363363
useParallelQueue = false,
364-
dispatcher // undici
364+
dispatcher = getGlobalDispatcher() // undici
365365
}) {
366366
// Ensure that the dispatcher is set accordingly
367367
assert(dispatcher)

lib/web/fetch/request.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const {
2424
requestDuplex
2525
} = require('./constants')
2626
const { kEnumerableProperty } = util
27-
const { kHeaders, kSignal, kState, kGuard, kRealm } = require('./symbols')
27+
const { kHeaders, kSignal, kState, kGuard, kRealm, kDispatcher } = require('./symbols')
2828
const { webidl } = require('./webidl')
2929
const { getGlobalOrigin } = require('./global')
3030
const { URLSerializer } = require('./dataURL')
@@ -78,6 +78,8 @@ class Request {
7878

7979
// 5. If input is a string, then:
8080
if (typeof input === 'string') {
81+
this[kDispatcher] = init.dispatcher
82+
8183
// 1. Let parsedURL be the result of parsing input with baseURL.
8284
// 2. If parsedURL is failure, then throw a TypeError.
8385
let parsedURL
@@ -101,6 +103,8 @@ class Request {
101103
// 5. Set fallbackMode to "cors".
102104
fallbackMode = 'cors'
103105
} else {
106+
this[kDispatcher] = input[kDispatcher]
107+
104108
// 6. Otherwise:
105109

106110
// 7. Assert: input is a Request object.
@@ -979,6 +983,10 @@ webidl.converters.RequestInit = webidl.dictionaryConverter([
979983
key: 'duplex',
980984
converter: webidl.converters.DOMString,
981985
allowedValues: requestDuplex
986+
},
987+
{
988+
key: 'dispatcher', // undici specific option
989+
converter: webidl.converters.any
982990
}
983991
])
984992

lib/web/fetch/symbols.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ module.exports = {
66
kSignal: Symbol('signal'),
77
kState: Symbol('state'),
88
kGuard: Symbol('guard'),
9-
kRealm: Symbol('realm')
9+
kRealm: Symbol('realm'),
10+
kDispatcher: Symbol('dispatcher')
1011
}

lib/web/fetch/webidl.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
const { types } = require('node:util')
44
const { toUSVString } = require('../../core/util')
55

6-
/** @type {import('../../types/webidl').Webidl} */
6+
/** @type {import('../../../types/webidl').Webidl} */
77
const webidl = {}
88
webidl.converters = {}
99
webidl.util = {}

lib/web/websocket/connection.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ const { CloseEvent } = require('./events')
1313
const { makeRequest } = require('../fetch/request')
1414
const { fetching } = require('../fetch/index')
1515
const { Headers } = require('../fetch/headers')
16-
const { getGlobalDispatcher } = require('../../global')
1716
const { kHeadersList } = require('../../core/symbols')
1817

1918
/** @type {import('crypto')} */
@@ -100,7 +99,7 @@ function establishWebSocketConnection (url, protocols, ws, onEstablish, options)
10099
const controller = fetching({
101100
request,
102101
useParallelQueue: true,
103-
dispatcher: options.dispatcher ?? getGlobalDispatcher(),
102+
dispatcher: options.dispatcher,
104103
processResponse (response) {
105104
// 1. If response is a network error or its status is not 101,
106105
// fail the WebSocket connection.

test/fetch/issue-2828.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'use strict'
2+
3+
const { once } = require('node:events')
4+
const { createServer } = require('node:http')
5+
const { test } = require('node:test')
6+
const { Agent, Request, fetch } = require('../..')
7+
const { tspl } = require('@matteo.collina/tspl')
8+
9+
test('issue #2828, dispatcher is allowed in RequestInit options', async (t) => {
10+
const { deepStrictEqual } = tspl(t, { plan: 1 })
11+
12+
class CustomAgent extends Agent {
13+
dispatch (options, handler) {
14+
options.headers['x-my-header'] = 'hello'
15+
return super.dispatch(...arguments)
16+
}
17+
}
18+
19+
const server = createServer((req, res) => {
20+
deepStrictEqual(req.headers['x-my-header'], 'hello')
21+
res.end()
22+
}).listen(0)
23+
24+
t.after(server.close.bind(server))
25+
await once(server, 'listening')
26+
27+
const request = new Request(`http://localhost:${server.address().port}`, {
28+
dispatcher: new CustomAgent()
29+
})
30+
31+
await fetch(request)
32+
})

0 commit comments

Comments
 (0)