是否可以将上下文与{/ net库中的Dialer
函数返回的SOCKS5
函数一起使用?
如果SOCKS5代理Dialer
在建立连接时阻塞,则使用代理Dialer
的HTTP客户端可能会卡住而无法中止连接。
答案 0 :(得分:0)
在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
包装在上面诸如处理任何阻止操作之类的上下文。