我正在尝试向给定的 url 发出请求,并捕获所遵循的重定向 url 及其状态代码。
我试过寻找我的具体问题的答案 -这很接近。
但是,我还需要在整个连接上添加代理、用户代理和超时,即无论有多少重定向/代理延迟等,时间量都不应超过 X 秒。
我通过设置请求标头来处理用户代理,并通过将它添加到传输结构来处理代理。我尝试探索 CheckRedirect 以进行重定向 - 但这只给了我 Url,我也需要状态代码,所以我必须实现 RoundTrip 函数。
目前一切正常 - 除了超时。这是我到目前为止所拥有的 -游乐场链接 我也在这里粘贴了相关代码 - 游乐场有一个完整版本,带有一个模拟重定向服务器 - 不幸的是,它恐慌地说连接可能因为游乐场限制而被拒绝 - 它完全在本地工作尽管。
type Redirect struct {
StatusCode int
URL string
}
type TransportWrapper struct {
Transport http.RoundTripper
Url string
Proxy string
UserAgent string
TimeoutInSeconds int
FinalUrl string
RedirectUrls []Redirect
}
// Implementing Round Tripper to capture intermediate urls
func (t *TransportWrapper) RoundTrip(req *http.Request) (*http.Response, error) {
transport := t.Transport
if transport == nil {
transport = http.DefaultTransport
}
resp, err := transport.RoundTrip(req)
if err != nil {
return resp, err
}
// Remember redirects
if resp.StatusCode >= 300 && resp.StatusCode <= 399 {
t.RedirectUrls = append(
t.RedirectUrls, Redirect{resp.StatusCode, req.URL.String()},
)
}
return resp, err
}
func (t *TransportWrapper) Do() (*http.Response, error) {
t.Transport = &http.Transport{}
if t.Proxy != "" {
proxyUrl, err := url.Parse(t.Proxy)
if err != nil {
return nil, err
}
t.Transport = &http.Transport{Proxy:http.ProxyURL(proxyUrl)}
// HELP
// Why does this fail
// t.Transport.Proxy = http.ProxyUrl(proxyUrl)
}
client := &http.Client{
Transport: t, // Since I've implemented RoundTrip I can pass this
// Timeout: t.TimeoutInSeconds * time.Second, // This Fails
}
req, err := http.NewRequest("GET", t.Url, nil)
if err != nil {
return nil, err
}
if t.UserAgent != "" {
req.Header.Set("User-Agent", t.UserAgent)
}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
t.FinalUrl = resp.Request.URL.String()
return resp, nil
}
德玛西亚99
相关分类