Skip to content

Commit 45c3259

Browse files
luddd3metcoder95
andauthored
feat: use resolved ports in dns interceptor (#3786)
Co-authored-by: Carlos Fuentes <[email protected]>
1 parent 20b8026 commit 45c3259

File tree

2 files changed

+156
-2
lines changed

2 files changed

+156
-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: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,6 +1388,142 @@ test('Should prefer affinity (dual stack - 6)', async t => {
13881388
t.equal(lookupCounter, 1)
13891389
})
13901390

1391+
test('Should use resolved ports (4)', async t => {
1392+
t = tspl(t, { plan: 5 })
1393+
1394+
let lookupCounter = 0
1395+
const server1 = createServer()
1396+
const server2 = createServer()
1397+
const requestOptions = {
1398+
method: 'GET',
1399+
path: '/',
1400+
headers: {
1401+
'content-type': 'application/json'
1402+
}
1403+
}
1404+
1405+
server1.on('request', (req, res) => {
1406+
res.writeHead(200, { 'content-type': 'text/plain' })
1407+
res.end('hello world!')
1408+
})
1409+
1410+
server1.listen(0)
1411+
1412+
server2.on('request', (req, res) => {
1413+
res.writeHead(200, { 'content-type': 'text/plain' })
1414+
res.end('hello world! (x2)')
1415+
})
1416+
server2.listen(0)
1417+
1418+
await Promise.all([once(server1, 'listening'), once(server2, 'listening')])
1419+
1420+
const client = new Agent().compose([
1421+
dns({
1422+
lookup (origin, opts, cb) {
1423+
lookupCounter++
1424+
cb(null, [
1425+
{ address: '127.0.0.1', family: 4, port: server1.address().port },
1426+
{ address: '127.0.0.1', family: 4, port: server2.address().port }
1427+
])
1428+
}
1429+
})
1430+
])
1431+
1432+
after(async () => {
1433+
await client.close()
1434+
server1.close()
1435+
server2.close()
1436+
1437+
await Promise.all([once(server1, 'close'), once(server2, 'close')])
1438+
})
1439+
1440+
const response = await client.request({
1441+
...requestOptions,
1442+
origin: 'http://localhost'
1443+
})
1444+
1445+
t.equal(response.statusCode, 200)
1446+
t.equal(await response.body.text(), 'hello world!')
1447+
1448+
const response2 = await client.request({
1449+
...requestOptions,
1450+
origin: 'http://localhost'
1451+
})
1452+
1453+
t.equal(response2.statusCode, 200)
1454+
t.equal(await response2.body.text(), 'hello world! (x2)')
1455+
1456+
t.equal(lookupCounter, 1)
1457+
})
1458+
1459+
test('Should use resolved ports (6)', async t => {
1460+
t = tspl(t, { plan: 5 })
1461+
1462+
let lookupCounter = 0
1463+
const server1 = createServer()
1464+
const server2 = createServer()
1465+
const requestOptions = {
1466+
method: 'GET',
1467+
path: '/',
1468+
headers: {
1469+
'content-type': 'application/json'
1470+
}
1471+
}
1472+
1473+
server1.on('request', (req, res) => {
1474+
res.writeHead(200, { 'content-type': 'text/plain' })
1475+
res.end('hello world!')
1476+
})
1477+
1478+
server1.listen(0, '::1')
1479+
1480+
server2.on('request', (req, res) => {
1481+
res.writeHead(200, { 'content-type': 'text/plain' })
1482+
res.end('hello world! (x2)')
1483+
})
1484+
server2.listen(0, '::1')
1485+
1486+
await Promise.all([once(server1, 'listening'), once(server2, 'listening')])
1487+
1488+
const client = new Agent().compose([
1489+
dns({
1490+
lookup (origin, opts, cb) {
1491+
lookupCounter++
1492+
cb(null, [
1493+
{ address: '::1', family: 6, port: server1.address().port },
1494+
{ address: '::1', family: 6, port: server2.address().port }
1495+
])
1496+
}
1497+
})
1498+
])
1499+
1500+
after(async () => {
1501+
await client.close()
1502+
server1.close()
1503+
server2.close()
1504+
1505+
await Promise.all([once(server1, 'close'), once(server2, 'close')])
1506+
})
1507+
1508+
const response = await client.request({
1509+
...requestOptions,
1510+
origin: 'http://localhost'
1511+
})
1512+
1513+
t.equal(response.statusCode, 200)
1514+
t.equal(await response.body.text(), 'hello world!')
1515+
1516+
const response2 = await client.request({
1517+
...requestOptions,
1518+
origin: 'http://localhost'
1519+
})
1520+
1521+
t.equal(response2.statusCode, 200)
1522+
t.equal(await response2.body.text(), 'hello world! (x2)')
1523+
1524+
t.equal(lookupCounter, 1)
1525+
})
1526+
13911527
test('Should handle max cached items', async t => {
13921528
t = tspl(t, { plan: 9 })
13931529

0 commit comments

Comments
 (0)