为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中读取缓冲区并将其重写为 http.Response

在 Go 中读取缓冲区并将其重写为 http.Response

Go
30秒到达战场 2021-10-25 14:29:16
我想在 golang 中编写一个 HTTP 代理。我将此模块用于代理:https : //github.com/elazarl/goproxy。当有人使用我的代理时,它会调用一个以 http.Response 作为输入的函数。我们称之为“resp”。resp.Body 是一个 io.ReadCloser。我可以使用它的 Read 方法将它读入 []byte 数组。但是随后它的内容从 resp.Body 中消失了。但是我必须返回一个 http.Response 和我读入 []byte 数组的 Body。我怎样才能做到这一点?你好,最大限度我的代码:proxy.OnResponse().DoFunc(func(resp *http.Response, ctx *goproxy.ProxyCtx) *http.Response {   body := resp.Body   var readBody []byte   nread, readerr := body.Read(readBody)   //the body is now empty   //and i have to return a body   //with the contents i read.   //how can i do that?   //doing return resp gives a Response with an empty body}
查看完整描述

2 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

您将必须首先阅读所有正文,以便您可以正确关闭它。一旦您读取了整个正文,您就可以简单地将其替换为Response.Body您的缓冲区。


readBody, err := ioutil.ReadAll(resp.Body)

if err != nil {

    // handle error

}

resp.Body.Close()

// use readBody


resp.Body = ioutil.NopCloser(bytes.NewReader(readBody))


查看完整回答
反对 回复 2021-10-25
?
浮云间

TA贡献1829条经验 获得超4个赞

那是因为io.Reader它更像是一个缓冲区,当你读取它时,你已经消耗了缓冲区中的数据,并留下一个空的主体。要解决该问题,您只需要关闭响应正文并ReadCloser从正文中创建一个新的正文,该正文现在是一个字符串。


import "io/ioutil"


readBody, err := ioutil.ReadAll(resp.Body)


if err != nil {

     // 

}


resp.Body.Close()

resp.Body = ioutil.NopCloser(bytes.NewReader(readBody))


查看完整回答
反对 回复 2021-10-25
  • 2 回答
  • 0 关注
  • 493 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信