我正在构建一个简单的缓存代理,它拦截HTTP请求,在response.Body中抓取内容,然后将其写回客户端.问题是,一旦我从response.Body读取,写回客户端包含一个空主体(其他所有内容,如标题,按预期编写).
这是当前的代码:
func requestHandler(w http.ResponseWriter, r *http.Request) {
client := &http.Client{}
r.RequestURI = ""
response, err := client.Do(r)
defer response.Body.Close()
if err != nil {
log.Fatal(err)
}
content, _ := ioutil.ReadAll(response.Body)
cachePage(response.Request.URL.String(), content)
response.Write(w)
}
Run Code Online (Sandbox Code Playgroud)
如果我删除content, _
和cachePage
行,它工作正常.包含行,请求返回和空体.任何想法,我怎么能得到公正的Body
的http.Response
,仍然完整地写出的响应http.ResponseWriter
?
在我的评论中,您可以实现io.ReadCloser
根据Dewy Broto(谢谢)你可以用以下方法做到这一点:
content, _ := ioutil.ReadAll(response.Body)
response.Body = ioutil.NopCloser(bytes.NewReader(content))
response.Write(w)
Run Code Online (Sandbox Code Playgroud)