{"record":{"id":"1063de91a619652b","repo":"Jguer/yay","slug":"socks5-dialer-does-not-support-dialcontext","errorCode":null,"errorMessage":"SOCKS5 dialer does not support DialContext","messagePattern":"SOCKS5 dialer does not support DialContext","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/runtime/runtime.go","lineNumber":62,"sourceCode":"\tlogger := text.NewLogger(os.Stdout, os.Stderr, os.Stdin, cfg.Debug, \"runtime\")\n\trunner := exe.NewOSRunner(logger.Child(\"runner\"))\n\n\ttransport := http.DefaultTransport.(*http.Transport).Clone()\n\ttransport.IdleConnTimeout = 90 * time.Second\n\ttransport.TLSHandshakeTimeout = 30 * time.Second\n\ttransport.ResponseHeaderTimeout = 30 * time.Second\n\ttransport.MaxIdleConns = 100\n\ttransport.MaxIdleConnsPerHost = 10\n\n\tif socks5Proxy := os.Getenv(\"SOCKS5_PROXY\"); socks5Proxy != \"\" {\n\t\tdialer, err := proxy.SOCKS5(\"tcp\", socks5Proxy, nil, proxy.Direct)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tcontextDialer, ok := dialer.(proxy.ContextDialer)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"SOCKS5 dialer does not support DialContext\")\n\t\t}\n\t\ttransport.DialContext = contextDialer.DialContext\n\t}\n\n\thttpClient := &http.Client{\n\t\tTimeout:   30 * time.Second,\n\t\tTransport: transport,\n\t}\n\n\tuserAgent := fmt.Sprintf(\"Yay/%s\", version)\n\tvoteClient, errVote := vote.NewClient(vote.WithUserAgent(userAgent),\n\t\tvote.WithHTTPClient(httpClient))\n\tif errVote != nil {\n\t\treturn nil, errVote\n\t}\n\n\tvoteClient.SetCredentials(\n\t\tos.Getenv(\"AUR_USERNAME\"),","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/Jguer/yay/blob/328f4b4939fb35f38c2f7c7ce3b8638a839bafa5/pkg/runtime/runtime.go#L44-L80","documentation":"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.","triggerScenarios":"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.","commonSituations":"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).","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"],"exampleFix":"// before\nimport \"golang.org/x/net/proxy\"\ndialer, err := proxy.SOCKS5(\"tcp\", \"127.0.0.1:1080\", nil, proxy.Direct)\n// after (go.mod: golang.org/x/net v0.x recent)\nimport \"golang.org/x/net/proxy\"\ndialer, err := proxy.SOCKS5(\"tcp\", \"127.0.0.1:1080\", nil, proxy.Direct)\n// and implement on custom dialers:\nfunc (d *myDialer) DialContext(ctx context.Context, network, addr string) (net.Conn, error) {\n\tvar c net.Conn\n\terr := d.dial(ctx, network, addr, &c)\n\treturn c, err\n}","handlingStrategy":"type-guard","validationCode":"var cd proxy.ContextDialer\nif d, ok := dialer.(proxy.ContextDialer); !ok {\n\treturn fmt.Errorf(\"proxy dialer %T lacks DialContext\", dialer)\n} else { cd = d }","typeGuard":"func supportsContextDial(dialer proxy.Dialer) (proxy.ContextDialer, bool) {\n\tcd, ok := dialer.(proxy.ContextDialer)\n\treturn cd, ok\n}","tryCatchPattern":"rt, err := NewRuntime(...)\nif err != nil && strings.Contains(err.Error(), \"SOCKS5 dialer does not support DialContext\") {\n\treturn nil, fmt.Errorf(\"upgrade golang.org/x/net or use an HTTP proxy: %w\", err)\n}","preventionTips":["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"],"tags":["proxy","socks5","networking","go"],"backgroundTag":"unsupported-operation","analyzedSha":"328f4b4939fb35f38c2f7c7ce3b8638a839bafa5","analyzedAt":"2026-09-07T16:45:12.608Z","contentChangedAt":"2026-09-07T16:45:12.608Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}