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

  1. Populate 'domains' (server side) or 'resolvers' (client side) with at least one entry.
  2. Remove the xdns block entirely if you did not intend to enable it.
  3. 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

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


AI-assisted analysis of XTLS/Xray-core@7d214f8b09 (2026-08-15). Data as JSON: /api/errors/3d862df83a01c352. Report an issue: GitHub.