gpt4 book ai didi

记录响应正文(反向代理)时的 Golang DumpResponse gzip 问题

转载 作者:数据小太阳 更新时间:2023-10-29 03:24:19 26 4
gpt4 key购买 nike

我在 main.go 中创建了一个简单的反向代理,如下所示:

reverseproxy := httputil.NewSingleHostReverseProxy("https://someurl/someuri")

这工作正常,但是,我想记录从服务器返回的响应。我还可以在 golang 推荐的标准 RoundTrip 方法中使用以下代码来执行此操作:

response, err := http.DefaultTransport.RoundTrip(request)
dumpresp, err := httputil.DumpResponse(response, true)

if err != nil {
return nil, err
}
log.Printf("%s", dumpresp)

除一件事外,以上所有内容均按预期工作,即响应,当 Content-Encoding: gzip 时,字符串在日志中显示为非 utf8 gzip 字符。这似乎是 golang 的疏忽,但也许我在文档中遗漏了一些内容,我已经阅读了几次文档。我不能在这里发布日志,因为这些字符不是 utf8,所以它们无论如何都不会显示在这个网站上。所以,我知道你在想什么,只需获取 gzip 内容并使用一种方法来删除 gzip 压缩。如果 DumpResponse 的响应不是部分 gzip 和部分标准 utf8 且无法将各部分彼此分开,那就太好了。

所以我知道你要说什么,为什么不像下面这样获取原始响应并进行 gzip 解码,并且“不”使用 DumpResponse。好吧,我也可以这样做,但存在以下问题:

var reader io.Reader
startreader := httputility.NewChunkedReader(reader)
switch response.Header.Get("Content-Encoding") {
case "gzip":
startreader, err = gzip.NewReader(response.Body)
log.Println("Response body gzip: ")
buf := new(bytes.Buffer)
buf.ReadFrom(startreader)
b := buf.Bytes()
s := *(*string)(unsafe.Pointer(&b))
for name, value := range response.Header {
var hvaluecomp string = ""
for i := 0; i < len(value); i++ {
hvaluecomp += value[i]
}
response.Header.Add(name,hvaluecomp)
}
log.Printf("%s", s)



default:
startreader = response.Body
buf := new(bytes.Buffer)
buf.ReadFrom(startreader)
b := buf.Bytes()
s := *(*string)(unsafe.Pointer(&b))
for name, value := range response.Header {
fmt.Printf("%v: %v\n", name, value)
}
log.Printf("%s", s)
}

上面的问题是,响应只能通过阅读器读取一次,之后响应不能再被反向代理读取,它使代理响应返回给浏览器 nil =),所以我又一次遇到了失败。我无法想象那些编码golang的人会错过解码gzip,只是奇怪,它似乎是如此简单。

所以最后,我的问题是,DumpResponse 是否让我能够解压缩 gzip,以便我可以记录实际响应而不是非 utf8 字符?在为生产产品调试问题时,这对日志阅读器没有好处。这将使内置的 golang 反向代理在我看来毫无用处,我将开始自己开发。

最佳答案

答案是复制流,然后您可以使用第二个变量将流重新发布回 request.body 对象,这样您就不会丢失任何数据。

buf, _ := ioutil.ReadAll(response.Body)
responseuse1 := ioutil.NopCloser(bytes.NewBuffer(buf))
responsehold := ioutil.NopCloser(bytes.NewBuffer(buf))

拉日志的方法:extractLogging(responseuse1)将 hold 推回 body,使其保持不变:response.Body = responsehold

返回响应

关于记录响应正文(反向代理)时的 Golang DumpResponse gzip 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46276891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com