是否可以使用带有 Dialer
的上下文?由 SOCKS5
返回来自网络/代理库的功能?
如果是 SOCKS5 代理 Dialer
在建立连接时阻塞,使用代理的 HTTP 客户端 Dialer
可能会卡住而无法中止连接。
最佳答案
在 golang.org/x/net/proxy.SOCKS5
的幕后它使用 golang.org/x/net/internal/socks.Dialer
,它有一个导出方法 DialContext
,从 Go 1.7 开始,http.Transport
支持自定义DialContext
作为一个领域。因此,您可以使用方法 DialContext
将拨号器转换为接口(interface)。并将其设置为自定义传输。
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/