首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用基本八月返回401而不是301重定向的Go HTTP请求

使用基本八月返回401而不是301重定向的Go HTTP请求
EN

Stack Overflow用户
提问于 2015-09-23 23:26:35
回答 1查看 3.3K关注 0票数 3

使用Go 1.5.1。

当我试图向使用Basic Auth自动重定向到HTTPS的站点发出请求时,我希望得到301重定向响应,而不是401。

代码语言:javascript
运行
复制
package main

import "net/http"
import "log"

func main() {
    url := "http://aerolith.org/files"
    username := "cesar"
    password := "password"
    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        log.Println("error", err)
    }
    if username != "" || password != "" {
        req.SetBasicAuth(username, password)
        log.Println("[DEBUG] Set basic auth to", username, password)
    }
    cli := &http.Client{

    }
    resp, err := cli.Do(req)
    if err != nil {
        log.Println("Do error", err)
    }
    log.Println("[DEBUG] resp.Header", resp.Header)
    log.Println("[DEBUG] req.Header", req.Header)
    log.Println("[DEBUG] code", resp.StatusCode)

}

请注意,curl返回301:

代码语言:javascript
运行
复制
curl -vvv http://aerolith.org/files --user cesar:password

知道会出什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-24 05:17:17

http://aerolith.org/files的请求重定向到https://aerolith.org/files (注意从http更改为https)。对https://aerolith.org/files的请求重定向到https://aerolith.org/files/ (注意尾/的添加)。

卷曲不跟随重定向。Curl打印从http://aerolith.org/files重定向到https://aerolith.org/files/的301状态。

Go客户端遵循两个重定向到https://aerolith.org/files/。对https://aerolith.org/files/的请求返回状态401,因为Go客户端不通过重定向传播授权头。

从Go客户端对https://aerolith.org/files/的请求和Curl返回状态200。

如果要成功地执行重定向和auth,请在CheckRedirect函数中设置auth标头:

代码语言:javascript
运行
复制
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的功能,可以直接使用运输。传输不遵循重定向。

代码语言:javascript
运行
复制
resp, err := http.DefaultTransport.RoundTrip(req)

应用程序还可以使用客户端CheckRedirect函数和一个可分辨的错误来防止重定向,如对如何使Go HTTP客户端不自动遵循重定向?的答复中所示。这种技术似乎有些流行,但比直接使用传输要复杂得多。

代码语言:javascript
运行
复制
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)
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32751065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档