{"id":"657c56aeb60e1c84","repo":"actix/actix-web","slug":"all-default-headers-must-be-added-before-cloning","errorCode":null,"errorMessage":"All default headers must be added before cloning.","messagePattern":"All default headers must be added before cloning\\.","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"actix-web/src/middleware/default_headers.rs","lineNumber":67,"sourceCode":"impl DefaultHeaders {\n    /// Constructs an empty `DefaultHeaders` middleware.\n    #[inline]\n    pub fn new() -> DefaultHeaders {\n        DefaultHeaders::default()\n    }\n\n    /// Adds a header to the default set.\n    ///\n    /// # Panics\n    /// Panics when resolved header name or value is invalid.\n    #[allow(clippy::should_implement_trait)]\n    pub fn add(mut self, header: impl TryIntoHeaderPair) -> Self {\n        // standard header terminology `insert` or `append` for this method would make the behavior\n        // of this middleware less obvious since it only adds the headers if they are not present\n\n        match header.try_into_pair() {\n            Ok((key, value)) => Rc::get_mut(&mut self.inner)\n                .expect(\"All default headers must be added before cloning.\")\n                .headers\n                .append(key, value),\n            Err(err) => panic!(\"Invalid header: {}\", err.into()),\n        }\n\n        self\n    }\n\n    #[doc(hidden)]\n    #[deprecated(\n        since = \"4.0.0\",\n        note = \"Prefer `.add((key, value))`. Will be removed in v5.\"\n    )]\n    pub fn header<K, V>(self, key: K, value: V) -> Self\n    where\n        HeaderName: TryFrom<K>,\n        <HeaderName as TryFrom<K>>::Error: Into<HttpError>,\n        HeaderValue: TryFrom<V>,","sourceCodeStart":49,"sourceCodeEnd":85,"githubUrl":"https://github.com/actix/actix-web/blob/937960ca67f20e14ffe2a075bf6d4593502be12c/actix-web/src/middleware/default_headers.rs#L49-L85","documentation":"`DefaultHeaders` stores its header map inside an `Rc<Inner>`. The `add()` method at actix-web/src/middleware/default_headers.rs:65-68 uses `Rc::get_mut`, which returns `None` once the `Rc` has been cloned (refcount > 1). Because `DefaultHeaders` is `Clone` and is cloned when wrapped into the middleware pipeline, calling `add()` after the middleware has been cloned panics with this message.","triggerScenarios":"Calling `.add(...)` on a `DefaultHeaders` value after it has already been `.clone()`d or after `.wrap(...)` consumed it (wrapping clones it into a `Transform`).","commonSituations":"Storing a `DefaultHeaders` in a shared config, cloning it, then trying to add more headers per-branch; or chaining `.add()` after `.wrap()`.","solutions":["Chain all `.add(...)` calls in a single builder expression before passing the result to `.wrap(...)`.","Do not clone the `DefaultHeaders` and then mutate it; build a fresh `DefaultHeaders::new()` for each variant.","If you need different default headers per scope, construct separate `DefaultHeaders` instances for each."],"exampleFix":"// before\nlet common = middleware::DefaultHeaders::new().add((\"X-App\", \"web\"));\nlet v2 = common.clone().add((\"X-Version\", \"2\")); // panics\n\n// after\nlet common = middleware::DefaultHeaders::new().add((\"X-App\", \"web\"));\nlet v2 = middleware::DefaultHeaders::new()\n    .add((\"X-App\", \"web\"))\n    .add((\"X-Version\", \"2\"));","handlingStrategy":"validation","validationCode":"// Track whether the DefaultHeaders has been cloned/wrapped and refuse to add afterward.\n// Simplest rule: build the full header chain in one expression before .wrap(...).\nlet mw = middleware::DefaultHeaders::new()\n    .add((\"X-App\", \"web\"))\n    .add((\"X-Version\", \"2\"));\n// only now: .wrap(mw)\n// For a second variant, start from DefaultHeaders::new() again.","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never call .add() on a cloned or already-wrapped DefaultHeaders.","Construct a fresh DefaultHeaders per distinct header set."],"tags":["rust","actix","actix-web","middleware","runtime","panic","builder","configuration"],"analyzedSha":"937960ca67f20e14ffe2a075bf6d4593502be12c","analyzedAt":"2026-08-06T01:15:46.978Z","schemaVersion":2}