具有上下文支持的socks5代理客户端

时间:2019-12-23 14:25:44

标签: go proxy

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

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

1 个答案:

答案 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包装在上面诸如处理任何阻止操作之类的上下文。