可以将上下文与net/proxy库中的SOCKS5函数返回的Dialer一起使用吗?
如果SOCKS5代理Dialer在建立连接时阻塞,则使用代理Dialer的HTTP客户端可能会在无法中止连接的情况下卡住。
发布于 2019-12-23 22:57:43
在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 team发送一个问题,要求导出它;如果这对你来说是一个太多的问题,你可以复制代码并保护它不被更改,或者使用http.Client.Timeout,或者同时编写start every http.Do并在它上面包装一个select作为上下文,就像处理任何阻塞操作一样。
https://stackoverflow.com/questions/59456936
复制相似问题