为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 读取 HTTPS 响应体

Golang 读取 HTTPS 响应体

Go
慕哥6287543 2022-07-11 15:42:58
我正在编写一些中间件,即使目标使用 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 和加密包文档,但没有找到任何线索。
查看完整描述

2 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

我不确定我是否理解问题,但这是我调用 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,

    }

}


查看完整回答
反对 回复 2022-07-11
?
MMTTMM

TA贡献1869条经验 获得超4个赞

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



查看完整回答
反对 回复 2022-07-11
  • 2 回答
  • 0 关注
  • 202 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号