Bug Description
Depending on the order of the dns and cache interceptor calls fail with Error: opts.headers is not a valid header map.
Reproduction
Example 1, dns then cache vs. cache then dns with empty array as headers:
import { Agent, interceptors, request } from "undici";
const { cache, dns } = interceptors;
const dnsThenCache = new Agent().compose(dns(), cache());
const cacheThenDns = new Agent().compose(cache(), dns());
const url = "https://www.google.com";
// NOTE: `const headers = {};` works
const headers = [];
const r1 = await request(url, {
dispatcher: dnsThenCache,
headers,
});
console.log(r1.statusCode);
r1.body.destroy();
const r2 = await request(url, {
dispatcher: cacheThenDns,
headers,
});
console.log(r2.statusCode);
r2.body.destroy();
200
node_modules/.pnpm/undici@8.7.0/node_modules/undici/lib/util/cache.js:47
throw new Error('opts.headers is not a valid header map')
^
Error: opts.headers is not a valid header map
at normalizeHeaders (node_modules/.pnpm/undici@8.7.0/node_modules/undici/lib/util/cache.js:47:17)
at node_modules/.pnpm/undici@8.7.0/node_modules/undici/lib/interceptor/cache.js:468:18
at node_modules/.pnpm/undici@8.7.0/node_modules/undici/lib/interceptor/dns.js:563:9
at node_modules/.pnpm/undici@8.7.0/node_modules/undici/lib/interceptor/dns.js:201:9
at GetAddrInfoReqWrap.callback (node_modules/.pnpm/undici@8.7.0/node_modules/undici/lib/interceptor/dns.js:262:9)
at GetAddrInfoReqWrap.onlookupall [as oncomplete] (node:dns:133:8)
Example 2, dns then cache vs. cache then dns with no headers and redirect:
import { Agent, interceptors, request } from "undici";
const { cache, dns, redirect } = interceptors;
const dnsThenCache = new Agent().compose(dns(), cache(), redirect({ maxRedirections: 3 }));
const cacheThenDns = new Agent().compose(cache(), dns(), redirect({ maxRedirections: 3 }));
const url = "https://google.com"; // redirects to https://www.google.com
const r1 = await request(url, {
dispatcher: dnsThenCache,
});
console.log(r1.statusCode);
r1.body.destroy();
const r2 = await request(url, {
dispatcher: cacheThenDns,
});
console.log(r2.statusCode);
r2.body.destroy();
200
node_modules/.pnpm/undici@8.7.0/node_modules/undici/lib/util/cache.js:47
throw new Error('opts.headers is not a valid header map')
^
Error: opts.headers is not a valid header map
at normalizeHeaders (node_modules/.pnpm/undici@8.7.0/node_modules/undici/lib/util/cache.js:47:17)
at node_modules/.pnpm/undici@8.7.0/node_modules/undici/lib/interceptor/cache.js:468:18
at node_modules/.pnpm/undici@8.7.0/node_modules/undici/lib/interceptor/dns.js:563:9
at node_modules/.pnpm/undici@8.7.0/node_modules/undici/lib/interceptor/dns.js:201:9
at GetAddrInfoReqWrap.callback (node_modules/.pnpm/undici@8.7.0/node_modules/undici/lib/interceptor/dns.js:262:9)
at GetAddrInfoReqWrap.onlookupall [as oncomplete] (node:dns:133:8)
Environment
- OS: Linux
- Node.js version: 26.4.0
- undici version: 8.7.0
Bug Description
Depending on the order of the
dnsandcacheinterceptor calls fail withError: opts.headers is not a valid header map.Reproduction
Example 1,
dns then cachevs.cache then dnswith empty array as headers:Example 2,
dns then cachevs.cache then dnswith no headers and redirect:Environment