{"record":{"id":"5eb7fde3dd9cc9c9","repo":"grafana/k6","slug":"setting-extra-http-headers-w","errorCode":null,"errorMessage":"setting extra HTTP headers: %w","messagePattern":"setting extra HTTP headers: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/common/network_manager.go","lineNumber":1041,"sourceCode":"\t}\n\n\tfetchHeaders := make([]*fetch.HeaderEntry, len(headers))\n\tfor i, header := range headers {\n\t\tfetchHeaders[i] = &fetch.HeaderEntry{\n\t\t\tName:  header.Name,\n\t\t\tValue: header.Value,\n\t\t}\n\t}\n\treturn fetchHeaders\n}\n\n// SetExtraHTTPHeaders sets extra HTTP request headers to be sent with every request.\nfunc (m *NetworkManager) SetExtraHTTPHeaders(headers network.Headers) error {\n\terr := network.\n\t\tSetExtraHTTPHeaders(headers).\n\t\tDo(cdp.WithExecutor(m.ctx, m.session))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"setting extra HTTP headers: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// SetOfflineMode toggles offline mode on/off.\nfunc (m *NetworkManager) SetOfflineMode(offline bool) error {\n\tif m.offline == offline {\n\t\treturn nil\n\t}\n\tm.offline = offline\n\n\taction := network.EmulateNetworkConditions(\n\t\tm.offline,\n\t\tm.networkProfile.Latency,\n\t\tm.networkProfile.Download,\n\t\tm.networkProfile.Upload,\n\t)","sourceCodeStart":1023,"sourceCodeEnd":1059,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/js/modules/k6/browser/common/network_manager.go#L1023-L1059","documentation":"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.","triggerScenarios":"Calling page.setExtraHTTPHeaders({...}) after page.close() began, after the browser crashed, or on a target that chromium already destroyed (navigation to a new process).","commonSituations":"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.","solutions":["Move setExtraHTTPHeaders to right after page creation, before goto()","Prefer browser.newContext({ extraHTTPHeaders }) so headers are set at context creation, which avoids the mid-session CDP call entirely","If headers change per navigation, set them before each goto, never after close starts","Check earlier log lines for the real session failure if this recurs"],"exampleFix":"// before\nawait page.goto('https://test.k6.io/');\nawait page.close();\nawait page.setExtraHTTPHeaders({ 'X-Test': '1' }); // dead session\n\n// after\nconst ctx = browser.newContext({ extraHTTPHeaders: { 'X-Test': '1' } });\nconst page = await ctx.newPage();\nawait page.goto('https://test.k6.io/');","handlingStrategy":"validation","validationCode":"if (page.isClosed()) { throw new Error('page closed; cannot set headers'); }\nawait page.setExtraHTTPHeaders({ 'X-Test': '1' });","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Prefer browser.newContext({ extraHTTPHeaders }) over the per-page call — no mid-session CDP command to fail","Set headers before the first goto()","Never call session-touching APIs after close() has started"],"tags":["cdp","browser","headers","network","lifecycle"],"backgroundTag":null,"analyzedSha":"93accf6570dcd306ca5e99cc44c393ee3797761b","analyzedAt":"2026-08-15T21:23:27.118Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}