grafana/k6 · error

setting extra HTTP headers: %w

Error message

setting extra HTTP headers: %w

What it means

The CDP command Network.setExtraHTTPHeaders failed, so the extra headers could not be attached to every request the page makes. Like the other Set* wrappers in the NetworkManager, this is a session-level failure: the page's CDP session was unusable when the command ran.

Source

Thrown at internal/js/modules/k6/browser/common/network_manager.go:1041

	}

	fetchHeaders := make([]*fetch.HeaderEntry, len(headers))
	for i, header := range headers {
		fetchHeaders[i] = &fetch.HeaderEntry{
			Name:  header.Name,
			Value: header.Value,
		}
	}
	return fetchHeaders
}

// SetExtraHTTPHeaders sets extra HTTP request headers to be sent with every request.
func (m *NetworkManager) SetExtraHTTPHeaders(headers network.Headers) error {
	err := network.
		SetExtraHTTPHeaders(headers).
		Do(cdp.WithExecutor(m.ctx, m.session))
	if err != nil {
		return fmt.Errorf("setting extra HTTP headers: %w", err)
	}

	return nil
}

// SetOfflineMode toggles offline mode on/off.
func (m *NetworkManager) SetOfflineMode(offline bool) error {
	if m.offline == offline {
		return nil
	}
	m.offline = offline

	action := network.EmulateNetworkConditions(
		m.offline,
		m.networkProfile.Latency,
		m.networkProfile.Download,
		m.networkProfile.Upload,
	)

View on GitHub (pinned to 93accf6570)

Solutions

  1. Move setExtraHTTPHeaders to right after page creation, before goto()
  2. Prefer browser.newContext({ extraHTTPHeaders }) so headers are set at context creation, which avoids the mid-session CDP call entirely
  3. If headers change per navigation, set them before each goto, never after close starts
  4. Check earlier log lines for the real session failure if this recurs

Example fix

// before
await page.goto('https://test.k6.io/');
await page.close();
await page.setExtraHTTPHeaders({ 'X-Test': '1' }); // dead session

// after
const ctx = browser.newContext({ extraHTTPHeaders: { 'X-Test': '1' } });
const page = await ctx.newPage();
await page.goto('https://test.k6.io/');
Defensive patterns

Strategy: validation

Validate before calling

if (page.isClosed()) { throw new Error('page closed; cannot set headers'); }
await page.setExtraHTTPHeaders({ 'X-Test': '1' });

Prevention

When it happens

Trigger: Calling page.setExtraHTTPHeaders({...}) after page.close() began, after the browser crashed, or on a target that chromium already destroyed (navigation to a new process).

Common situations: Setting auth/tenant headers late in the script or inside event handlers; setting headers right before context.close(); a prior crash (OOM-killed chromium) leaving the session dead with this being the first call to notice.

Related errors


AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15). Data as JSON: /api/errors/5eb7fde3dd9cc9c9. Report an issue: GitHub.