簡體   English   中英

讀取緩沖區並將其重寫為Go中的http.Response

[英]Reading a Buffer and Rewriting it to a http.Response in Go

我想在golang中編寫HTTP代理。 我將此模塊用於代理: https//github.com/elazarl/goproxy 當有人使用我的代理時,它會調用一個http.Response作為輸入的函數。 我們稱之為“resp”。 resp.Body是一個io.ReadCloser。 我可以使用它的Read方法從它讀入一個[]字節數組。 但是后來它的內容從resp.Body中消失了。 但我必須返回一個http.Response與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
}

你將不得不首先閱讀所有的身體,所以你可以正確地關閉它。 讀完整個實體后,只需將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))

這是因為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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM