猿问

在 Go 中模拟 HTTPS 响应

我正在尝试为向 Web 服务发出请求的包编写测试。我遇到的问题可能是由于我对 TLS 缺乏了解。


目前我的测试看起来像这样:


func TestSimple() {

    server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

        w.Header().Set("Content-Type", "application/json")

        w.WriteHeader(200)

        fmt.Fprintf(w, `{ "fake" : "json data here" }`)

    }))

    transport := &http.Transport{

        Proxy: func(req *http.Request) (*url.URL, error) {

            return url.Parse(server.URL)

        },

    }

    // Client is the type in my package that makes requests

    client := Client{

        c: http.Client{Transport: transport},

    }


    client.DoRequest() // ...

}

我的包有一个包变量(我希望它是一个常量..),用于查询 Web 服务的基地址。它是一个 https 网址。我上面创建的测试服务器是纯 HTTP,没有 TLS。


默认情况下,我的测试失败并显示错误“tls:第一条记录看起来不像 TLS 握手”。


为了让它起作用,我的测试在进行查询之前将包变量更改为普通的 http URL 而不是 https。


有没有办法解决?我可以将包变量设置为常量 (https),然后设置一个http.Transport“降级”到未加密的 HTTP,或者httptest.NewTLSServer()改为使用?


(当我尝试使用时,NewTLSServer()我收到“http: TLS 握手错误来自 127.0.0.1:45678: tls: 收到长度为 20037 的超大记录”)


GCT1015
浏览 262回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答