我正在尝试向给定的URL请求,并捕获重定向URL及其遵循的状态代码。

我试图为我的特定问题寻找答案-这很接近。

但是,我还需要在整个连接上添加代理,用户代理和超时,即无论有多少重定向/代理等待时间等,时间量都不应超过X秒。

我已经通过设置请求标头来处理用户代理,并通过将其添加到Transport结构来代理。
我尝试探索CheckRedirect进行重定向-但这只给了我Url,还需要状态代码,因此我必须实现RoundTrip函数。

到目前为止,一切工作正常-除了超时。
这是我到目前为止所拥有的-游乐场链接
我也在这里粘贴了相关的代码-操场上有一个完整的版本,并带有一个模拟重定向服务器-不幸的是,它惊慌地说连接可能由于操场上的限制而被拒绝-尽管它完全在本地工作。

问题1:如何添加超时?

尝试1:

但是Go抱怨说" * main.TransportWrapper不支持CancelRequest;不支持超时"

尝试2:

但是Go抱怨说" dt.CancelRequest未定义(类型http.RoundTripper没有字段或方法CancelRequest)"

如何在不做太多事情的情况下实现此CancelRequest,而让默认的CancelRequest接管呢?

问题2:我走的路不好吗,有没有解决问题的替代方法,

给定一个Url,Proxy,UserAgent和Timeout-返回响应以及重定向URL及其状态代码,然后到达目的地。

我希望我已经适当地措辞了。

谢谢


Client.CheckRedirect已经存在一个用于检查重定向的钩子。

您可以提供回调以执行所需的操作。

如果您确实想创建自己的传输器来扩展其他功能,则需要提供CancelRequest方法,如错误消息所述,以处理Client.Timeout

更常见的是,您将嵌入Transport,以便自动升级所有方法和字段。 但是,您应该避免在传输中使用可写字段,因为可以安全地同时使用它,否则,您应该使用互斥锁保护所有访问权限,或者必须确保仅在一个goroutine中使用它。

一个最小的示例如下所示:

然后您可以在客户端中使用超时: