2015-07-20 104 views
3

我想在golang中編寫HTTP代理。我使用這個模塊代理:https://github.com/elazarl/goproxy。當有人使用我的代理時,它會以http.Response作爲輸入來調用一個函數。我們稱之爲「resp」。 resp.Body是一個io.ReadCloser。我可以通過讀取方法將它讀入[]字節數組中。但是,它的內容已經從resp.Body中消失了。但是我必須返回一個http.Response,並將其讀入一個[]字節的數組。我怎樣才能做到這一點?讀取緩衝區並將其重寫到http.Response中去

問候,

最大

我的代碼:

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 
} 

回答

3

你不得不先讀身體的各個,這樣你就可以正確地關閉它。讀完整個機構後,您可以簡單地將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)) 
+0

我想這是'NopCloser'與單個o。 – inf

+0

@inf:謝謝:) – JimB

1

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