{"record":{"id":"c7587e84dd29ebbf","repo":"nautechsystems/nautilus_trader","slug":"invalid-websocket-reconnect-header-name-e","errorCode":null,"errorMessage":"Invalid WebSocket reconnect header name: {e}","messagePattern":"Invalid WebSocket reconnect header name: (.+?)","errorType":"exception","errorClass":"TransportError","httpStatus":null,"severity":"error","filePath":"crates/network/src/websocket/client.rs","lineNumber":2276,"sourceCode":"pub struct ReconnectHeaders {\n    inner: Arc<RwLock<Vec<(String, String)>>>,\n}\n\nimpl ReconnectHeaders {\n    fn new(headers: Vec<(String, String)>) -> Self {\n        Self {\n            inner: Arc::new(RwLock::new(headers)),\n        }\n    }\n\n    /// Replaces a header used by future automatic reconnect attempts.\n    ///\n    /// # Errors\n    ///\n    /// Returns an error if the header name or value is invalid.\n    pub fn update(&self, name: &str, value: &str) -> Result<(), TransportError> {\n        let name = HeaderName::from_bytes(name.as_bytes()).map_err(|e| {\n            TransportError::Io(std::io::Error::new(\n                std::io::ErrorKind::InvalidInput,\n                format!(\"Invalid WebSocket reconnect header name: {e}\"),\n            ))\n        })?;\n        HeaderValue::from_str(value).map_err(|e| {\n            TransportError::Io(std::io::Error::new(\n                std::io::ErrorKind::InvalidInput,\n                format!(\"Invalid WebSocket reconnect header value: {e}\"),\n            ))\n        })?;\n\n        let name = name.as_str();\n        let mut headers = self.inner.write();\n        headers.retain(|(existing, _)| !existing.eq_ignore_ascii_case(name));\n        headers.push((name.to_string(), value.to_string()));\n        Ok(())\n    }\n","sourceCodeStart":2258,"sourceCodeEnd":2294,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/network/src/websocket/client.rs#L2258-L2294","documentation":"The reconnect header update API validates the header name with HeaderName::from_bytes (from the http crate). Names must be valid HTTP header names (token characters only, no spaces or non-ASCII). If parsing fails, this InvalidInput TransportError is returned and the header is not updated. This is a caller input-validation error, not a network condition.","triggerScenarios":"Calling WebSocketReconnectHeaders::update (or the equivalent client API) with a name containing invalid characters, whitespace, colon, or empty string, e.g. update(\"X Custom Header\", \"v\").","commonSituations":"Building header names dynamically from config or environment strings with typos/spaces; concatenating name parts with separators; copying header names with trailing whitespace from docs.","solutions":["Correct the header name to a valid HTTP token (letters, digits, '-', '_', '.', alphanumerics only)","Trim whitespace and validate names from config/env before calling update","Use a constant/known-good header name instead of a dynamically built one where possible"],"exampleFix":"// before\nheaders.update(\"X API Key\", key)?; // invalid: space in name\n// after\nheaders.update(\"X-Api-Key\", key)?;","handlingStrategy":"validation","validationCode":"fn is_valid_header_name(name: &str) -> bool {\n    !name.is_empty()\n        && name.bytes().all(|b| b.is_ascii_alphanumeric() || b\"-_.\".contains(&b))\n}","typeGuard":null,"tryCatchPattern":"match headers.update(name, value) {\n    Err(e) if e.to_string().contains(\"header name\") => return Err(InvalidConfig(format!(\"bad header name {name:?}\"))),\n    r => r?,\n}","preventionTips":["Use constant, known-good header name strings","Trim and validate names loaded from config/env before passing them in","Remember valid names are HTTP tokens: no spaces, colons, or non-ASCII"],"tags":["websocket","http-headers","validation","rust"],"backgroundTag":"invalid-argument-format","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}