golang dumpresponse gzip问题记录响应主体(逆转)



我在我的主体中创建了一个简单的反向代理。go如下:

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

这很好,但是,我想记录服务器返回的响应。我还可以利用Golang推荐的标准往返方法中的以下代码进行此操作:

response, err := http.DefaultTransport.RoundTrip(request)
dumpresp, err := httputil.DumpResponse(response, true)
if err != nil {
    return nil, err
}
log.Printf("%s", dumpresp)

除了一件事外,所有上述所有内容都可以正常运行,当内容编码时,响应:gzip,字符串以logs为non-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: %vn", name, value)
    }
    log.Printf("%s", s)
}

上述问题是,响应只能通过读者读取一次,此后,反向代理再也无法读取响应,并且它使代理响应回到浏览器nil =),所以再次遇到了失败。我无法想象编码Golang的人会错过解码GZIP的解码,这很奇怪,这似乎是如此简单。

最终,我的问题是,Dumpresponse是否可以使我能够解压缩GZIP,以便我可以记录实际响应而不是非UTF8字符?在调试生产产品问题时,这对日志读取器没有好处。这将使内置的golang反向代理在我眼中无用,我会自己开始开发。

答案是复制流,然后您可以使用第二个变量将流将流重新寄回请求。Body对象,因此您不会丢失任何数据。

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

拉动日志记录的方法:deftractLogging(wendmentUse1)将握住的握住到身体,以使其不受影响:响应body =响应

返回响应

确实使我能够解压缩GZIP

不,它没有。

对我来说,似乎主要问题既不是反向代理也不是dumpresponse,而是您试图"记录"二进制数据:无论是gzip还是其他二进制数据(如图像)。只需修复记录逻辑:如果原始身体是二进制的,则应呈现某种形式的表示或转换。对于Gziped东西,首先是gunzip(但这可能仍然是二进制"非UTF8"数据,不适合记录)。关注真正的问题:如何"日志"二进制数据。

最新更新