Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 88 additions & 1 deletion test/interceptors/dns.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const { tspl } = require('@matteo.collina/tspl')
const pem = require('@metcoder95/https-pem')

const { interceptors, Agent, Client, Pool, request } = require('../..')
const { dns } = interceptors
const { dns, cache, deduplicate } = interceptors

// Helper to check if IPv6 is available for localhost
// This is called synchronously at test definition time
Expand Down Expand Up @@ -2156,6 +2156,93 @@ test('#4444 - Should preserve iterable headers', async t => {
t.equal(await response.body.text(), 'hello world!')
})

test('#5522 - Should not throw when dns re-dispatches into a composed cache interceptor', async t => {
t = tspl(t, { plan: 2 })

const server = createServer()

server.on('request', (req, res) => {
res.writeHead(200, { 'content-type': 'text/plain' })
res.end('hello world!')
})

server.listen(0)

await once(server, 'listening')

// dns is the outer interceptor here, so its re-dispatch after resolving
// lands back in cache's normalizeHeaders() with a flat header array.
const client = new Agent().compose(cache(), dns({
lookup: (_origin, _opts, cb) => {
cb(null, [
{
address: '127.0.0.1',
family: 4
}
])
}
}))

after(async () => {
await client.close()
server.close()

await once(server, 'close')
})

const response = await request(`http://localhost:${server.address().port}`, {
dispatcher: client,
headers: []
})

t.equal(response.statusCode, 200)
t.equal(await response.body.text(), 'hello world!')
})

test('#5522 - Should not throw when dns re-dispatches into a composed deduplicate interceptor', async t => {
t = tspl(t, { plan: 2 })

const server = createServer()

server.on('request', (req, res) => {
res.writeHead(200, { 'content-type': 'text/plain' })
res.end('hello world!')
})

server.listen(0)

await once(server, 'listening')

// Same root cause as the cache-interceptor case above, but through
// deduplicate() -- it shares the same normalizeHeaders()/makeCacheKey()
// utility from lib/util/cache.js, so it was equally affected.
const client = new Agent().compose(deduplicate(), dns({
lookup: (_origin, _opts, cb) => {
cb(null, [
{
address: '127.0.0.1',
family: 4
}
])
}
}))

after(async () => {
await client.close()
server.close()

await once(server, 'close')
})

const response = await request(`http://localhost:${server.address().port}`, {
dispatcher: client,
headers: []
})

t.equal(response.statusCode, 200)
t.equal(await response.body.text(), 'hello world!')
})

test('#3951 - Should handle lookup errors correctly', async t => {
const suite = tspl(t, { plan: 1 })

Expand Down
Loading