{"record":{"id":"3a6b2af5264101ba","repo":"SeleniumHQ/selenium","slug":"extra-header-name-not-found","errorCode":null,"errorMessage":"Extra header '{name}' not found","messagePattern":"Extra header '(.+?)' not found","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"warning","filePath":"py/private/_network_handlers.py","lineNumber":806,"sourceCode":"        self._extra_headers_intercept: str | None = None\n\n    def _wrap(self, params):\n        return Request(self._network._conn, params, deferred=True)\n\n    def set_extra_header(self, name: str, value: str) -> None:\n        \"\"\"Record a header to merge into every subsequent request.\"\"\"\n        self.extra_headers[name.lower()] = value\n        if self._extra_headers_intercept is None:\n            result = self._network._add_intercept(phases=[self._phase])\n            self._extra_headers_intercept = result.get(\"intercept\") if result else None\n        if self._subscription_callback_id is None:\n            self._subscription_callback_id = self._network.add_event_handler(self._event_name, self._on_event)\n        logger.debug(\"Added extra header %s\", name.lower())\n\n    def remove_extra_header(self, name: str) -> None:\n        \"\"\"Stop merging a header by (case-insensitive) name.\"\"\"\n        if self.extra_headers.pop(name.lower(), None) is None:\n            raise ValueError(f\"Extra header '{name}' not found\")\n        if not self.extra_headers:\n            self._drop_extra_headers_intercept()\n        logger.debug(\"Removed extra header %s\", name.lower())\n\n    def clear_extra_headers(self) -> None:\n        \"\"\"Stop merging all extra headers.\"\"\"\n        self.extra_headers.clear()\n        self._drop_extra_headers_intercept()\n\n    def _drop_extra_headers_intercept(self) -> None:\n        if self._extra_headers_intercept:\n            self._network._remove_intercept(self._extra_headers_intercept)\n            self._extra_headers_intercept = None\n        if not self._keep_subscription() and self._subscription_callback_id is not None:\n            self._network.remove_event_handler(self._event_name, self._subscription_callback_id)\n            self._subscription_callback_id = None\n\n    def intercept_ids(self) -> set:","sourceCodeStart":788,"sourceCodeEnd":824,"githubUrl":"https://github.com/SeleniumHQ/selenium/blob/aa36b38e696a0909e973bdf5e2f9031ffe842c4b/py/private/_network_handlers.py#L788-L824","documentation":"Raised as a ValueError by ExtraHeadersMixin.remove_extra_header() when the given header name (lowercased) is not present in the extra_headers dictionary. The method calls extra_headers.pop(name.lower(), None); if the default None is returned (meaning the key was absent), it raises. Extra headers are tracked case-insensitively by lowercasing on both add and remove.","triggerScenarios":"Calling remove_extra_header(name) where 'name.lower()' was never added via set_extra_header/add_extra_header, or was already removed. The pop returns None and the ValueError fires.","commonSituations":"Calling remove_extra_header before any header with that name was added; double-removal of the same header; case mismatch that was actually already handled by lowercasing but the header simply was not set; calling remove after clear_extra_headers emptied the dictionary.","solutions":["Track which headers you have added and only remove ones that exist, or guard with a membership check.","Use clear_extra_headers() to remove all headers at once instead of removing individually.","Set a variable to track the added header names and null them out after removal to prevent double-removal."],"exampleFix":"# before\nextra_headers.set_extra_header('X-Custom', 'value')\nextra_headers.remove_extra_header('X-Custom')\nextra_headers.remove_extra_header('X-Custom')  # ValueError\n\n# after\nadded_headers = set()\nextra_headers.set_extra_header('X-Custom', 'value')\nadded_headers.add('x-custom')\nif 'x-custom' in added_headers:\n    extra_headers.remove_extra_header('X-Custom')\n    added_headers.discard('x-custom')","handlingStrategy":"validation","validationCode":"# Track added headers and check before removing\nadded = set()\nextra_headers.set_extra_header('X-Custom', 'val')\nadded.add('x-custom')\nif name.lower() in added:\n    extra_headers.remove_extra_header(name)\n    added.discard(name.lower())","typeGuard":null,"tryCatchPattern":"try:\n    extra_headers.remove_extra_header(name)\nexcept ValueError as e:\n    if 'not found' in str(e):\n        # header was never added or already removed\n        pass\n    else:\n        raise","preventionTips":["Track added header names in a set and discard after removal.","Use clear_extra_headers() to remove all at once.","Remember header names are matched case-insensitively (lowercased)."],"tags":["python","bidi","network","headers","validation"],"backgroundTag":null,"analyzedSha":"aa36b38e696a0909e973bdf5e2f9031ffe842c4b","analyzedAt":"2026-08-14T02:32:32.244Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}