多次从阅读器中读取

jef*_*upp 4 io go

我正在构建一个简单的缓存代理,它拦截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行,它工作正常.包含行,请求返回和空体.任何想法,我怎么能得到公正Bodyhttp.Response,仍然完整地写出的响应http.ResponseWriter

Dan*_*anG 5

在我的评论中,您可以实现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)