首页 > 解决方案 > 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 和加密包文档,但没有找到任何线索。

标签: gomiddleware

解决方案


我不确定我是否理解问题,但这是我调用 https google 链接并打印输出。

package main

import (
    "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,
    }
}

推荐阅读