Golang:Gzip未压缩的http.Response.Body

时间:2015-06-25 17:21:01

标签: go gzip

我正在构建一个Go应用程序,它接受一个http.Response对象并将其保存(响应头+ body)到redis哈希。当应用程序收到未经过gzip压缩的http.Response.Body时,我想在将其保存到缓存之前对其进行gzip。

我的困惑源于我无法清楚地了解Go的io界面,以及如何在http.Response.Body io.ReadCloser和gzip {之间进行协商{1}}。我想这里有一个优雅的流媒体解决方案,但我无法让它发挥作用。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:7)

如果你已经确定主体是未压缩的,那么如果你需要[]byte压缩数据(而不是例如已经拥有你可以写io.Writer,例如,如果你想将正文保存到文件然后你想要流入文件而不是缓冲区)那么这样的东西应该有效:

func getCompressedBody(r *http.Response) ([]byte, error) {
    var buf bytes.Buffer
    gz := gzip.NewWriter(&buf)
    if _, err := io.Copy(gz, r.Body); err != nil {
        return nil, err
    }
    err := gz.Close()
    return buf.Bytes(), err
}

(这只是一个例子,可能是在线而不是作为一个函数;如果你想要它作为一个函数,那么它应该采用io.Reader而不是*http.Response)。