func dialViaSOCKS(ctx context.Context, destination string) (net.Conn, error) {
    dialer, err := proxy.SOCKS5(
        "tcp",
        "127.0.0.1:1080",
        nil,
        &net.Dialer{Timeout: 5 * time.Second},
    )
    if err != nil {
        return nil, err
    }
    contextDialer, ok := dialer.(proxy.ContextDialer)
    if !ok {
        return nil, errors.New("SOCKS dialer lacks context support")
    }
    return contextDialer.DialContext(ctx, "tcp", destination)
}

在已有的 Go 网络包中,使用 context、errors、net、time 和 x/net/proxy 导入。nil 参数表示不选择任何 SOCKS 凭据。对于允许的公共代理路由上的公共目标,SOCKS5 代理列表 为 dialer 的端点提供候选。

导出的 proxy.ContextDialer 断言让不受支持的实现显式失败。请检查已部署的依赖,而不是点名某个内部 dialer 类型,或启动调用方无法管理的阻塞 goroutine。

context 控制连接的建立。一旦返回 net.Conn,应施加适当的读/写或更高层请求的截止时间。基础 dialer 的连接超时与应用的总预算是不同的限制。

对于 HTTP 传输集成,保留其正常的 TLS 和 HTTP 行为。返回的、感知 context 的 SOCKS 流是交给传输层的交接,而不是响应,也不是之后所有字节的生命周期策略。

相关文章