XTLS/Xray-core · error
empty domains & empty resolvers
Error message
empty domains & empty resolvers
What it means
Thrown by Xdns.Build() when the xdns DNS-routing config declares neither 'domains' nor 'resolvers'. The builder requires at least one of the two lists so the module has something to act on; a completely empty object is rejected. Note that a legacy top-level 'domain' key is also rejected separately as a removed feature.
Source
Thrown at infra/conf/transport_finalmask.go:708
PaddingMin: paddingMin,
PaddingMax: paddingMax,
}, nil
}
type Xdns struct {
Domain json.RawMessage `json:"domain"`
Domains []string `json:"domains"`
Resolvers []string `json:"resolvers"`
}
func (c *Xdns) Build() (proto.Message, error) {
if c.Domain != nil {
return nil, errors.PrintRemovedFeatureError("domain", "domains(server) & resolvers(client)")
}
if len(c.Domains) == 0 && len(c.Resolvers) == 0 {
return nil, errors.New("empty domains & empty resolvers")
}
for _, r := range c.Resolvers {
if !strings.Contains(r, "+udp://") {
return nil, errors.New("invalid resolver ", r)
}
}
return &xdns.Config{
Domains: c.Domains,
Resolvers: c.Resolvers,
}, nil
}
type XMC struct {
Hostname string `json:"hostname"`
Profiles []XMCProfile `json:"profiles"`
Password string `json:"password"`View on GitHub (pinned to 7d214f8b09)
Solutions
- Populate 'domains' (server side) or 'resolvers' (client side) with at least one entry.
- Remove the xdns block entirely if you did not intend to enable it.
- Check for the removed legacy 'domain' key and migrate it to 'domains'/'resolvers'.
Example fix
// before
"transport": { "xdns": {} }
// after
"transport": { "xdns": { "resolvers": ["8.8.8.8+udp://"] } } Defensive patterns
Strategy: validation
Validate before calling
if len(xdnsCfg.Domains) == 0 && len(xdnsCfg.Resolvers) == 0 {
return fmt.Errorf("xdns block is empty: supply domains or resolvers")
} Prevention
- Never emit an xdns object without at least one of domains/resolvers.
- Use exact plural field names; the singular 'domain' key is removed.
- Fail fast in config generators when optional modules decode to zero-value.
When it happens
Trigger: Adding an xdns transport block with only unrelated fields, e.g. {} or {"domains": [], "resolvers": []}, produces this error during Build(). Also hit when JSON keys are misspelled (e.g. "domain" instead of "domains") so both slices decode empty.
Common situations: Enabling xdns without deciding server-side domains or client-side resolvers; typos in field names; migrating from the removed singular 'domain' field and leaving the object empty.
Related errors
- unknown action: {}
- rCode out of range: {}
- unknown nonIPQuery: {}
- invalid resolver + r
- bridge tag is empty
AI-assisted analysis of XTLS/Xray-core@7d214f8b09 (2026-08-15).
Data as JSON: /api/errors/3d862df83a01c352.
Report an issue: GitHub.