当前位置: 首页 > 知识库问答 >
问题:

Golang读取HTTPS响应体

胡嘉歆
2023-03-14

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

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

在我的handler func中,我正在这样做。。。。

    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的目的地时,响应主体似乎仍然是加密的,尽管复制到始发方的最终响应导致始发方接收有效响应主体内容。

这是使用加密路径读取响应主体的预期行为吗?我可以解密这些数据,使其可读吗?我已经阅读了超文本传输协议、tls和加密包留档,但没有发现任何线索。

共有2个答案

丰胤运
2023-03-14

谢谢大家的评论。特拉维斯似乎已经发现了我的问题。我正在阅读的响应主体似乎是gzip编码的(响应包含“Content Encoding:gzip”)。为了验证情况是否属实,我必须在转发之前明确删除原始请求中的“Accept Encoding:gzip”头,并将传输配置为设置“DisableCompression:true”。一旦我做了这两个更改,我就会看到没有“内容编码”标题的响应,并且我读的正文是可读的。

谢承颜
2023-03-14

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

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,
    }
}
 类似资料:
  • 问题内容: 反向代理是可行的。如何获得响应主体? 问题答案: 有一个领域。您可以使用它来修改响应。例如: 整个场景的操场示例:http : //play.golang.org/p/b0S5CbCMrI。

  • Axios 0.17.1 响应的console.log为 {data:“{”error“:”name必须输入多个…null [“ispipe”:protected]=>null}}“,状态:203,statustext:”非权威信息“,标题:{…},配置:{…},…}配置:{adapter:f,转换请求:{…},转换响应:{…},超时:0,xsrfcookiename:”xsrf-token“,…

  • 我创建了一个反向代理,如下所示: 并从main调用它: 它在客户端可以正常工作,但是我想阅读代理的响应,我怎么做?

  • 我使用Jmeter对一个包括web套接字连接的应用程序进行负载测试。 当尝试使用单读取采样器读取帧中的数据时,得到错误响应代码:无响应响应消息:读取超时,未收到响应。 有人能帮我解决这个问题吗? 线程名称:密苏里州TestEnv 1-1样例开始时间:2019-10-09 10:40:43 IST加载时间:1000连接时间:0延迟时间:0大小以字节为单位:0发送字节:0头大小以字节为单位:0主体大小

  • 我在main.go中创建了一个简单的反向代理,如下所示: 这工作正常,但是,我想记录从服务器返回的响应。我也可以使用Go语言推荐的标准RoundTrip方法中的以下代码来实现这一点: 除了响应之外,上述所有功能都可以正常工作,当内容编码为gzip时,字符串在日志中显示为非utf8 gzip字符。这似乎是golang的疏忽,但可能是我在文档中遗漏了一些东西,我已经读了好几遍了。我不能在这里发布日志,

  • 我正在尝试使用Go语言向我的(magento)网络服务器发出请求。 我设法发出了一个POST请求,但是,我没有得到与从cmd使用CURL时相同的响应。我关注了这篇文章(如何在Golang中获取JSON响应),它没有给我任何响应。 所以我试了这个 这只是像这样返回http响应 当使用< code > curl-g-X POST " my . dev/index . PHP/rest/V1/guest