Skip to content

normalizeHeaders fails with opts.headers is not a valid header map depending on interceptor ordering #5522

Description

@peterhirn

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions