Jguer/yay · error
SOCKS5 dialer does not support DialContext
Error message
SOCKS5 dialer does not support DialContext
What it means
NewRuntime builds an HTTP transport whose DialContext comes from a SOCKS5 proxy dialer; it type-asserts the golang.org/x/net/proxy Dialer to proxy.ContextDialer and fails fast with this error if the assertion fails. Older x/net versions returned a plain *socks.Dialer (or a dialer without DialContext) for socks5 URLs, which cannot honor context cancellation. The library rejects such a dialer instead of silently losing cancellation support.
Solutions
- Upgrade golang.org/x/net to a recent version (go get golang.org/x/net@latest && go mod tidy) so proxy dialers implement ContextDialer
- Verify the proxy scheme is socks5/socks5h and the x/net proxy package constructs it (not a custom registered dialer)
- If a custom dialer type is registered, add a DialContext(ctx context.Context, network, addr string) (net.Conn, error) method
- As a last resort, pre-wrap the dialer in a ContextDialer adapter before passing it to the transport
Example fix
// before
import "golang.org/x/net/proxy"
dialer, err := proxy.SOCKS5("tcp", "127.0.0.1:1080", nil, proxy.Direct)
// after (go.mod: golang.org/x/net v0.x recent)
import "golang.org/x/net/proxy"
dialer, err := proxy.SOCKS5("tcp", "127.0.0.1:1080", nil, proxy.Direct)
// and implement on custom dialers:
func (d *myDialer) DialContext(ctx context.Context, network, addr string) (net.Conn, error) {
var c net.Conn
err := d.dial(ctx, network, addr, &c)
return c, err
} Defensive patterns
Strategy: type-guard
Validate before calling
var cd proxy.ContextDialer
if d, ok := dialer.(proxy.ContextDialer); !ok {
return fmt.Errorf("proxy dialer %T lacks DialContext", dialer)
} else { cd = d } Type guard
func supportsContextDial(dialer proxy.Dialer) (proxy.ContextDialer, bool) {
cd, ok := dialer.(proxy.ContextDialer)
return cd, ok
} Try / catch
rt, err := NewRuntime(...)
if err != nil && strings.Contains(err.Error(), "SOCKS5 dialer does not support DialContext") {
return nil, fmt.Errorf("upgrade golang.org/x/net or use an HTTP proxy: %w", err)
} Prevention
- Pin golang.org/x/net to a recent version in go.mod
- After registering custom proxy schemes, assert ContextDialer in a unit test
- Prefer proxy.FromEnvironment with a modern x/net over hand-rolled SOCKS5 clients
- If context cancellation is not needed, adapt the dialer with a goroutine-based DialContext wrapper instead of failing
When it happens
Trigger: NewRuntime with proxy.FromEnvironment (or proxy.URL set to a socks5:// URL) returns a dialer that does not implement ContextDialer — e.g. an outdated golang.org/x/net where proxy.SOCKS5 does not return a context-aware dialer, or a custom proxy dialer registered via proxy.RegisterDialerType lacking DialContext.
Common situations: go.mod pinning an old golang.org/x/net (< ~2019) without context-aware SOCKS5; app configured with ALL_PROXY/HTTP_PROXY=socks5://...; vendored dependency stub that only implements Dial(network, addr).
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
AI-assisted analysis of Jguer/yay@328f4b4939 (2026-09-07).
Data as JSON: /api/errors/1063de91a619652b.
Report an issue: GitHub.
Appendix: source
Thrown at pkg/runtime/runtime.go:62
logger := text.NewLogger(os.Stdout, os.Stderr, os.Stdin, cfg.Debug, "runtime")
runner := exe.NewOSRunner(logger.Child("runner"))
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.IdleConnTimeout = 90 * time.Second
transport.TLSHandshakeTimeout = 30 * time.Second
transport.ResponseHeaderTimeout = 30 * time.Second
transport.MaxIdleConns = 100
transport.MaxIdleConnsPerHost = 10
if socks5Proxy := os.Getenv("SOCKS5_PROXY"); socks5Proxy != "" {
dialer, err := proxy.SOCKS5("tcp", socks5Proxy, nil, proxy.Direct)
if err != nil {
return nil, err
}
contextDialer, ok := dialer.(proxy.ContextDialer)
if !ok {
return nil, fmt.Errorf("SOCKS5 dialer does not support DialContext")
}
transport.DialContext = contextDialer.DialContext
}
httpClient := &http.Client{
Timeout: 30 * time.Second,
Transport: transport,
}
userAgent := fmt.Sprintf("Yay/%s", version)
voteClient, errVote := vote.NewClient(vote.WithUserAgent(userAgent),
vote.WithHTTPClient(httpClient))
if errVote != nil {
return nil, errVote
}
voteClient.SetCredentials(
os.Getenv("AUR_USERNAME"),View on GitHub (pinned to 328f4b4939)