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

  1. Upgrade golang.org/x/net to a recent version (go get golang.org/x/net@latest && go mod tidy) so proxy dialers implement ContextDialer
  2. Verify the proxy scheme is socks5/socks5h and the x/net proxy package constructs it (not a custom registered dialer)
  3. If a custom dialer type is registered, add a DialContext(ctx context.Context, network, addr string) (net.Conn, error) method
  4. 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

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)