Gzip未压缩的http.Response.Body

5
我正在构建一个Go应用程序,该应用程序接收一个http.Response对象并将其(响应头和正文)保存到Redis哈希中。当应用程序收到一个未经gzip压缩的http.Response.Body时,我想在保存到缓存之前进行gzip压缩。
我的困惑在于我无法清晰地理解Go的io接口,以及如何在http.Response.Bodyio.ReadCloser和gzip Writer之间进行协商。我想象这里有一种优雅的流式解决方案,但我无法让它完全运行起来。
1个回答

11

如果你已经确定了正文未经压缩,并且如果你需要一个[]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。)


正是我所需要的。谢谢! - Squirkle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接