1 回答
TA贡献1883条经验 获得超3个赞
http://aerolith.org/files重定向到的请求https://aerolith.org/files(注意从 http 更改为 https)。https://aerolith.org/files重定向到的请求https://aerolith.org/files/(注意添加尾随 /)。
Curl 不遵循重定向。Curl 打印重定向的 301 状态http://aerolith.org/filesto https://aerolith.org/files/。
Go 客户端遵循两个重定向到https://aerolith.org/files/. 请求以https://aerolith.org/files/状态 401 返回,因为 Go 客户端不会通过重定向传播授权标头。
https://aerolith.org/files/来自 Go 客户端和 Curl 的请求返回状态 200。
如果您想成功跟踪重定向和身份验证,请在CheckRedirect函数中设置 auth 标头:
cli := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
if len(via) >= 10 {
return errors.New("stopped after 10 redirects")
}
req.SetBasicAuth(username, password)
return nil
}}
resp, err := cli.Do(req)
如果要匹配 Curl 的功能,请直接使用传输。传输不遵循重定向。
resp, err := http.DefaultTransport.RoundTrip(req)
应用程序还可以使用客户端CheckRedirect函数和可区分的错误来防止重定向,如如何使 Go HTTP 客户端不自动跟随重定向的答案中所示?. 这种技术似乎有点流行,但比直接使用传输更复杂。
redirectAttemptedError := errors.New("redirect")
cli := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return redirectAttemptedError
}}
resp, err := cli.Do(req)
if urlError, ok := err.(*url.Error); ok && urlError.Err == redirectAttemptedError {
// ignore error from check redirect
err = nil
}
if err != nil {
log.Println("Do error", err)
}
- 1 回答
- 0 关注
- 212 浏览
添加回答
举报