{"record":{"id":"6306729a057d5ef2","repo":"TechnitiumSoftware/DnsServer","slug":"dns-over-http-real-ip-header-name-cannot-contain-i","errorCode":null,"errorMessage":"DNS-over-HTTP Real IP header name cannot contain invalid characters.","messagePattern":"DNS-over-HTTP Real IP header name cannot contain invalid characters\\.","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"DnsServerCore/Dns/DnsServer.cs","lineNumber":7843,"sourceCode":"        }\n\n        public string DnsTlsCertificatePath\n        { get { return _dnsTlsCertificatePath; } }\n\n        public string DnsTlsCertificatePassword\n        { get { return _dnsTlsCertificatePassword; } }\n\n        public string DnsOverHttpRealIpHeader\n        {\n            get { return _dnsOverHttpRealIpHeader; }\n            set\n            {\n                if (string.IsNullOrEmpty(value))\n                    _dnsOverHttpRealIpHeader = \"X-Real-IP\";\n                else if (value.Length > 255)\n                    throw new ArgumentException(\"DNS-over-HTTP Real IP header name cannot exceed 255 characters.\", nameof(DnsOverHttpRealIpHeader));\n                else if (value.Contains(' '))\n                    throw new ArgumentException(\"DNS-over-HTTP Real IP header name cannot contain invalid characters.\", nameof(DnsOverHttpRealIpHeader));\n                else\n                    _dnsOverHttpRealIpHeader = value;\n            }\n        }\n\n        public IReadOnlyDictionary<string, TsigKey> TsigKeys\n        {\n            get { return _tsigKeys; }\n            set\n            {\n                if ((value is null) || (value.Count == 0))\n                    _tsigKeys = null;\n                else if (value.Count > byte.MaxValue)\n                    throw new ArgumentOutOfRangeException(nameof(TsigKeys), \"TSIG keys cannot have more than 255 entries.\");\n                else\n                    _tsigKeys = value;\n            }\n        }","sourceCodeStart":7825,"sourceCodeEnd":7861,"githubUrl":"https://github.com/TechnitiumSoftware/DnsServer/blob/d0484b6c1e7439cdc53d67d81e9c876cda2ad756/DnsServerCore/Dns/DnsServer.cs#L7825-L7861","documentation":"Thrown by the DnsOverHttpRealIpHeader setter when the supplied header name contains a space character. HTTP header field names must be RFC 7230 tokens (no whitespace), so the library rejects any value containing ' ' as invalid. Note the check is specifically for the space character — other non-token characters are not caught here.","triggerScenarios":"Setting DnsOverHttpRealIpHeader to a string that contains a space, e.g. \"X Real IP\", \"X-Forwarded-For :\", or a value with trailing/leading whitespace from a config trim failure.","commonSituations":"Typing the header with spaces instead of hyphens; reading the value from an environment variable or config file without trimming; concatenating header name and value by mistake.","solutions":["Use the canonical hyphenated form, e.g. \"X-Real-IP\" or \"X-Forwarded-For\".","Trim whitespace from config-sourced values before assigning: value.Trim().","Set to null/empty to fall back to the built-in default \"X-Real-IP\"."],"exampleFix":"// before\nserver.DnsOverHttpRealIpHeader = \"X Forwarded For\";\n\n// after\nserver.DnsOverHttpRealIpHeader = \"X-Forwarded-For\";","handlingStrategy":"validation","validationCode":"static string CleanHeaderName(string value) =>\n    string.IsNullOrWhiteSpace(value) ? null : value.Trim();\n\nserver.DnsOverHttpRealIpHeader = CleanHeaderName(configHeader);","typeGuard":"static bool IsValidRealIpHeader(string value) =>\n    string.IsNullOrEmpty(value) || (!value.Contains(' ') && value.Length <= 255);","tryCatchPattern":"try { server.DnsOverHttpRealIpHeader = headerName; }\ncatch (ArgumentException ex) when (ex.ParamName == nameof(server.DnsOverHttpRealIpHeader))\n{\n    server.DnsOverHttpRealIpHeader = \"X-Real-IP\";\n}","preventionTips":["Trim config values before assignment.","Use canonical hyphenated header names.","Validate header tokens against RFC 7230 token rules in your config layer."],"tags":["dns","configuration","validation","doh","http-header"],"backgroundTag":null,"analyzedSha":"d0484b6c1e7439cdc53d67d81e9c876cda2ad756","analyzedAt":"2026-08-13T22:57:35.508Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}