XTLS/Xray-core · error
failed to dial to %s
Error message
failed to dial to %s
What it means
fetchHTTPContent performs the GET with a 30s-timeout client and wraps transport failure as "failed to dial to <target>". Note the underlying error is discarded, so network vs DNS vs TLS problems are indistinguishable from the message alone. Only http/https targets reach this point.
Source
Thrown at main/commands/all/api/shared.go:95
parsedTarget, err := url.Parse(target)
if err != nil {
return nil, err
}
if s := strings.ToLower(parsedTarget.Scheme); s != "http" && s != "https" {
return nil, fmt.Errorf("invalid scheme: %s", parsedTarget.Scheme)
}
client := &http.Client{
Timeout: 30 * time.Second,
}
resp, err := client.Do(&http.Request{
Method: "GET",
URL: parsedTarget,
Close: true,
})
if err != nil {
return nil, fmt.Errorf("failed to dial to %s", target)
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
return nil, fmt.Errorf("unexpected HTTP status code: %d", resp.StatusCode)
}
content, err := buf.ReadAllToBytes(resp.Body)
if err != nil {
return nil, errors.New("failed to read HTTP response")
}
return content, nil
}
func showJSONResponse(m proto.Message) {
if isNil(m) {
returnView on GitHub (pinned to 7d214f8b09)
Solutions
- Verify reachability independently: `curl -v <url>` from the same machine/user
- Fix DNS (switch resolver) or route egress through a working proxy
- If TLS/clock related, fix system time or CA store
- Consider hosting the resource (e.g. geoip.dat) locally to avoid the remote fetch
Example fix
# diagnose (the error intentionally hides the cause) curl -v https://example.com/geoip.dat # then fix DNS/proxy/egress accordingly
Defensive patterns
Strategy: retry
Validate before calling
// pre-flight reachability check with the real cause preserved
func reachable(target string, timeout time.Duration) error {
u, _ := url.Parse(target)
conn, err := net.DialTimeout("tcp", u.Host, timeout)
if err != nil { return err }
return conn.Close()
} Try / catch
var body []byte
err := backoffRetry(3, func() error {
var e error
body, e = fetchHTTPContent(target)
return e
})
if err != nil && strings.Contains(err.Error(), "failed to dial") {
// error hides the cause — re-diagnose out-of-band with curl before retrying further
} Prevention
- The wrapper discards the net error — diagnose with curl -v when it fires
- Mirror geodata locally to avoid runtime remote fetches
- Ensure egress DNS/proxy work in the deployment environment
When it happens
Trigger: DNS resolution failure, connection refused/timeout, TLS handshake error, or firewall block while fetching remote content (geodata files, API endpoints) from the xray CLI.
Common situations: Blocked regions needing a proxy for outbound HTTPS; stale DNS; server down; egress firewall in containers; system clock skew breaking TLS certificate validation.
Related errors
- failed to dial to
- unexpected HTTP status code: %d
- LRU size is bigger than subnet size
- No available name server could be created from
- failed to create unexpected ip matcher
AI-assisted analysis of XTLS/Xray-core@7d214f8b09 (2026-08-15).
Data as JSON: /api/errors/f4a6ddd8c2c94f0e.
Report an issue: GitHub.