go - 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 和加密包文档,但没有找到任何线索。
解决方案
我不确定我是否理解问题,但这是我调用 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,
}
}
推荐阅读
- java - 如何根据 Java 中的 PayFrequency 找到当前是哪个 PayPeriodNumber?
- python - PIP 版本 VSCode
- mysql - 通过 Workbench 制作外键约束时出错
- wordpress - 需要将所有匹配模式的 URL 重定向到另一个 url
- python - Telethon:检查客户端实例是否已登录
- javascript - 如何在ckeditor 5中获取所选文本的HTML代码?
- amazon-web-services - 如何将烧瓶应用程序发送到 AWS Elastic Beanstalk?
- documentum - 具有相同名称的多个文件 - 区分它们以进行检索的最佳方法是什么
- arrays - vuejs列表渲染属性=索引?
- image - Google Sheet & App Script:如何从链接预览中获取图像?