如何拦截并修改 response 的内容啊?

2016-09-03 22:36:45 +08:00
 fanwei

如下所示,简单做个代理

func main() {
	remote, _ := url.Parse("http://www.xxxx.com")
	proxy := httputil.NewSingleHostReverseProxy(remote)
	log.Fatal( http.ListenAndServe(":9999", proxy))
}

我想把代理后返回的一些内容替换掉.但是怎么都成功不了. 下面这样怎么没反映? go 的 http 太"精髓"了.才学几天,摸不着门道. 哪位同学能指个路吗?谢谢.

func (t *transport) RoundTrip(req *http.Request) (res *http.Response, err error) {
	res, err = t.RoundTripper.RoundTrip(req)

	b, err := ioutil.ReadAll(res.Body)
	if err != nil {
		return nil, err
	}
	defer res.Body.Close()
	b = bytes.Replace(b, []byte("Keywords"), []byte("xxxxxxxx"), -1)
	body := ioutil.NopCloser(bytes.NewReader(b))
	res.Body = body
	res.ContentLength = int64(len(b))
	res.Header.Set("Content-Length", strconv.Itoa(len(b)))
	return res, nil
}
1661 次点击
所在节点    Go 编程语言
3 条回复
SuperFashi
2016-09-03 22:58:51 +08:00
sakeven
2016-09-04 00:03:35 +08:00
我猜是因为 res 的内容被压缩了,所以没被替换。
不显式的在 req 里声明压缩响应,是能成功的。
加一句这个试试 req.Header.Del("Accept-Encoding")
fanwei
2016-09-04 12:15:39 +08:00
@sakeven
....................低级错误,后来发现确实是这原因.
谢谢

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

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

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

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

© 2021 V2EX