猿问

Golang 读取 HTTPS 响应体

我正在编写一些中间件,即使目标使用 TLS 加密,我也需要能够记录响应正文内容。


我有一个处理程序链,在其中我将响应主体存储在中间缓冲区中,以便我可以多次读取它。这是基于 icza 提供的优秀示例(Golang 读取请求正文)。


在我的处理程序函数中,我正在这样做....


    body, err := ioutil.ReadAll(resp.Body)

    if err != nil {

        log.Fatal(err)

    }


    // Print the response body to stdout

    fmt.Printf("Dest HTTP response body: %s\n", body)


    bRdr := bytes.NewReader(body)

    n, err := io.Copy(w, bRdr) // Copy the entire response body into our outgoing response

我发现,当连接到不使用 TLS 的目的地时,我得到可读的输出,但是当使用 TLS 连接到目的地时,似乎响应正文仍然是加密的,尽管复制到对发起者的最终响应会导致接收有效响应正文内容的发起者。


这是使用加密路径读取响应正文的预期行为吗?我可以解密这些数据以使其可读吗?我已经阅读了 http、tls 和加密包文档,但没有找到任何线索。


慕哥6287543
浏览 203回答 2
2回答

慕桂英546537

我不确定我是否理解问题,但这是我调用 https google 链接并打印输出。package mainimport (    "fmt"    "io/ioutil"    "log"    "net/http"    "golang.org/x/net/http2")func main() {    client := &http.Client{Transport: transport2()}    res, err := client.Get("https://www.google.com")    if err != nil {        log.Fatal(err)    }    body, err := ioutil.ReadAll(res.Body)    if err != nil {        log.Fatal(err)    }    res.Body.Close()    fmt.Printf("Code: %d\n", res.StatusCode)    fmt.Printf("Body: %s\n", body)}func transport2() *http2.Transport {    return &http2.Transport{        DisableCompression: true,        AllowHTTP:          false,    }}

MMTTMM

谢谢大家的意见。Travis 似乎已经确定了我遇到的问题。我正在阅读的响应正文似乎是 gzip 编码的(响应包含“Content-Encoding:gzip”)。为了验证是否是这种情况,我必须在转发之前显式删除原始请求中的“Accept-Encoding: gzip”标头,并将传输配置为设置“DisableCompression:true”。一旦我进行了这两项更改,我就会看到没有“Content-Encoding”标题的响应,并且我阅读的正文是人类可读的。
随时随地看视频慕课网APP

相关分类

Go
我要回答