是否可以将上下文与net / proxy库中Dialer函数返回的SOCKS5一起使用?

如果在建立连接时SOCKS5代理Dialer阻塞,则使用代理Dialer的HTTP客户端可能会卡住而无法中止连接。

最佳答案

golang.org/x/net/proxy.SOCKS5的幕后,它使用golang.org/x/net/internal/socks.Dialer,它具有导出的方法DialContext,并且从Go 1.7开始,http.Transport支持将自定义DialContext作为字段。因此,您可以将拨号程序转换为使用DialContext方法的接口,并将其设置为自定义传输方式。

dc := dialer.(interface {
    DialContext(ctx context.Context, network, addr string) (net.Conn, error)
})
httpTransport.DialContext = dc.DialContext

游乐场:https://play.golang.org/p/tSi9IZ-2Zqg

注意:虽然这是有效的Go代码,但有人认为它依赖于该软件包不想导出的实现细节(隐藏在internal中)。我认为最好将问题发送给Go团队以要求将其导出。如果这对您来说太麻烦了,则可以复制代码并保留其以免更改,或者使用http.Client.Timeout或同时写入每个http.Do的开头,然后将select包裹在其上以用于上下文处理任何阻塞操作。

关于go - 具有上下文支持的socks5代理客户端,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59456936/

10-10 23:25