Examples For Using io.Pipe in Go

2020-03-01 10:24:35 +08:00
 lcj2class

真的很喜欢这个功能,小巧精悍。最近在一个项目中用到了,大概是这样的:

项目中有一个自定义的 http.RoundTripper,之前都是纯文本发送数据,现在想加上 gzip 压缩。

func (crt roundTripper) RoundTrip(r *http.Request) (*http.Response, error) {
	if crt.compress {
		r.Header.Add(headerContentEncoding, "gzip")
		raw := r.Body
		pr, pw := io.Pipe()
		go func() {
			defer pw.Close()
			gw := gzip.NewWriter(pw)
			defer gw.Close()
			if n, err := io.Copy(gw, raw); err != nil {
				crt.log.Logf("gzip body failed. written: %d, err: %v ", n, err)
			}
		}()
		// set 0 enable Transfer-Encoding:chunked
		r.ContentLength = 0
		r.Body = pr
	}
	return crt.r.RoundTrip(r)
}
1478 次点击
所在节点    Go 编程语言
1 条回复
kuro1
2020-03-05 13:23:50 +08:00
这里的 io.copy 倒是让我学到了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/648767

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX