是否可以将上下文与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/