Skip to content

Commit 8fa8205

Browse files
committed
feat: use resolved ports in dns interceptor
Support custom functions that resolve e.g. SRV records with ports
1 parent d78b7ca commit 8fa8205

File tree

2 files changed

+93
-2
lines changed

2 files changed

+93
-2
lines changed

lib/interceptor/dns.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,20 @@ class DNSInstance {
6363
newOpts.affinity
6464
)
6565

66+
let port
67+
if (typeof ip.port === 'number') {
68+
port = `:${ip.port}`
69+
} else if (origin.port !== '') {
70+
port = `:${origin.port}`
71+
} else {
72+
port = ''
73+
}
74+
6675
cb(
6776
null,
6877
`${origin.protocol}//${
6978
ip.family === 6 ? `[${ip.address}]` : ip.address
70-
}${origin.port === '' ? '' : `:${origin.port}`}`
79+
}${port}`
7180
)
7281
})
7382
} else {
@@ -85,11 +94,20 @@ class DNSInstance {
8594
return
8695
}
8796

97+
let port
98+
if (typeof ip.port === 'number') {
99+
port = `:${ip.port}`
100+
} else if (origin.port !== '') {
101+
port = `:${origin.port}`
102+
} else {
103+
port = ''
104+
}
105+
88106
cb(
89107
null,
90108
`${origin.protocol}//${
91109
ip.family === 6 ? `[${ip.address}]` : ip.address
92-
}${origin.port === '' ? '' : `:${origin.port}`}`
110+
}${port}`
93111
)
94112
}
95113
}

test/interceptors/dns.js

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,6 +1366,79 @@ test('Should prefer affinity (dual stack - 6)', async t => {
13661366
t.equal(lookupCounter, 1)
13671367
})
13681368

1369+
test('Should use resolved ports', async t => {
1370+
t = tspl(t, { plan: 5 })
1371+
1372+
let lookupCounter = 0
1373+
const server1 = createServer()
1374+
const server2 = createServer()
1375+
const requestOptions = {
1376+
method: 'GET',
1377+
path: '/',
1378+
headers: {
1379+
'content-type': 'application/json'
1380+
}
1381+
}
1382+
1383+
server1.on('request', (req, res) => {
1384+
res.writeHead(200, { 'content-type': 'text/plain' })
1385+
res.end('hello world!')
1386+
})
1387+
1388+
server1.listen(0)
1389+
1390+
server2.on('request', (req, res) => {
1391+
res.writeHead(200, { 'content-type': 'text/plain' })
1392+
res.end('hello world! (x2)')
1393+
})
1394+
server2.listen(0)
1395+
1396+
await Promise.all([once(server1, 'listening'), once(server2, 'listening')])
1397+
1398+
const client = new Agent().compose([
1399+
dispatch => {
1400+
return (opts, handler) => {
1401+
return dispatch(opts, handler)
1402+
}
1403+
},
1404+
dns({
1405+
lookup (origin, opts, cb) {
1406+
lookupCounter++
1407+
cb(null, [
1408+
{ address: '127.0.0.1', family: 4, port: server1.address().port },
1409+
{ address: '127.0.0.1', family: 4, port: server2.address().port }
1410+
])
1411+
}
1412+
})
1413+
])
1414+
1415+
after(async () => {
1416+
await client.close()
1417+
server1.close()
1418+
server2.close()
1419+
1420+
await Promise.all([once(server1, 'close'), once(server2, 'close')])
1421+
})
1422+
1423+
const response = await client.request({
1424+
...requestOptions,
1425+
origin: 'http://localhost'
1426+
})
1427+
1428+
t.equal(response.statusCode, 200)
1429+
t.equal(await response.body.text(), 'hello world!')
1430+
1431+
const response2 = await client.request({
1432+
...requestOptions,
1433+
origin: 'http://localhost'
1434+
})
1435+
1436+
t.equal(response2.statusCode, 200)
1437+
t.equal(await response2.body.text(), 'hello world! (x2)')
1438+
1439+
t.equal(lookupCounter, 1)
1440+
})
1441+
13691442
test('Should handle max cached items', async t => {
13701443
t = tspl(t, { plan: 9 })
13711444

0 commit comments

Comments
 (0)