{"record":{"id":"200ca896df30a0e6","repo":"XTLS/Xray-core","slug":"failed-to-parse-name-server","errorCode":null,"errorMessage":"failed to parse name server: {}","messagePattern":"failed to parse name server: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"infra/conf/dns.go","lineNumber":81,"sourceCode":"\t\tc.Address = advanced.Address\n\t\tc.ClientIP = advanced.ClientIP\n\t\tc.Port = advanced.Port\n\t\tc.SkipFallback = advanced.SkipFallback\n\t\tc.Domains = advanced.Domains\n\t\tc.ExpectedIPs = advanced.ExpectedIPs\n\t\tc.ExpectIPs = advanced.ExpectIPs\n\t\tc.QueryStrategy = advanced.QueryStrategy\n\t\tc.Tag = advanced.Tag\n\t\tc.TimeoutMs = advanced.TimeoutMs\n\t\tc.DisableCache = advanced.DisableCache\n\t\tc.ServeStale = advanced.ServeStale\n\t\tc.ServeExpiredTTL = advanced.ServeExpiredTTL\n\t\tc.FinalQuery = advanced.FinalQuery\n\t\tc.UnexpectedIPs = advanced.UnexpectedIPs\n\t\treturn nil\n\t}\n\n\treturn errors.New(\"failed to parse name server: \", string(data))\n}\n\nfunc (c *NameServerConfig) Build() (*dns.NameServer, error) {\n\tif c.Address == nil {\n\t\treturn nil, errors.New(\"nameserver address is not specified\")\n\t}\n\n\tdomainRules, err := geodata.ParseDomainRules(c.Domains, geodata.Domain_Substr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif len(c.ExpectedIPs) == 0 {\n\t\tc.ExpectedIPs = c.ExpectIPs\n\t}\n\n\tactPrior := false\n\tvar newExpectedIPs StringList","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/XTLS/Xray-core/blob/7d214f8b094f75322fa3990f8aadad1c912f24f5/infra/conf/dns.go#L63-L99","documentation":"Thrown by NameServerConfig.UnmarshalJSON in infra/conf/dns.go when the 'servers' entry is neither a plain address string nor a valid advanced nameserver object (the object form with address/subnet settings failed to unmarshal or validate). The raw JSON data is appended to the message.","triggerScenarios":"dns.servers entries like 8.8.8.8 (unquoted, invalid JSON or number), {\"address\": 123}, {\"address\": null}, an array [\"a\",\"b\"] where one entry is a nested object, or an object missing a string 'address' field so the advanced-form branch fails.","commonSituations":"Mixing old-style string servers and new object form in one array incorrectly; forgetting quotes around DNS IPs with dots (usually a JSON syntax error caught earlier); typos in object keys so the address field stays empty.","solutions":["Use quoted strings: \"servers\": [\"1.1.1.1\", \"8.8.8.8\"]","For object form always include a string address: {\"address\": \"https://dns.google/dns-query\", \"domains\": [\"geosite:google\"]}","Check the appended raw data to find the failing entry"],"exampleFix":"// before\n\"servers\": [{\"adress\": \"1.1.1.1\"}]\n\n// after\n\"servers\": [{\"address\": \"1.1.1.1\"}]","handlingStrategy":"validation","validationCode":"func validateDNSServerEntry(v any) error {\n    switch t := v.(type) {\n    case string:\n        if t == \"\" {\n            return errors.New(\"empty nameserver string\")\n        }\n        return nil\n    case map[string]any:\n        addr, ok := t[\"address\"]\n        if !ok {\n            return errors.New(\"nameserver object missing 'address' key\")\n        }\n        _, isStr := addr.(string)\n        if !isStr {\n            return errors.New(\"nameserver 'address' must be a string\")\n        }\n        return nil\n    }\n    return errors.New(\"nameserver must be a string or object with string address\")\n}","typeGuard":"func isDNSServerEntry(v any) bool {\n    if _, ok := v.(string); ok {\n        return true\n    }\n    m, ok := v.(map[string]any)\n    return ok && reflect.TypeOf(m[\"address\"]).Kind() == reflect.String\n}","tryCatchPattern":"if err := json.Unmarshal(entry, &nsc); err != nil {\n    if strings.Contains(err.Error(), \"failed to parse name server\") {\n        return fmt.Errorf(\"dns.servers entry %s: use a quoted string or {\"address\": \"...\"}\", entry)\n    }\n    return err\n}","preventionTips":["Quote DNS server addresses","Object-form entries must contain a string 'address' key","Lint the servers array before deploying"],"tags":["config","dns","validation","xray"],"backgroundTag":null,"analyzedSha":"7d214f8b094f75322fa3990f8aadad1c912f24f5","analyzedAt":"2026-08-15T14:26:24.325Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}