go語言實現http proxy的關鍵一步

go語言自帶包ReverseProxy 實現了proxy的功能。url

但我但願proxy進程可以在代理的同時,完整的把請求和請求體記錄在日誌裏。代理

僅使用ReverseProxy 包的話,uri記錄沒問題,但body只能被讀取一次,proxy將body記錄在日誌,那麼backend就沒辦法再讀body了。日誌

所以須要proxy進程讀過一次body以後,把數據從新寫回去,留給backend讀取。code

func (h *handle) ServeHTTP(w http.ResponseWriter, r *http.Request) {
        backend, err := url.Parse("http://" + h.backendHost)
        if err != nil {
                return
        }
        body, err := ioutil.ReadAll(r.Body)
        defer r.Body.Close()
        if err != nil {
                log.Println(err.Error())
                return
        }
        r.Body = ioutil.NopCloser(bytes.NewBuffer(body))
        proxy := httputil.NewSingleHostReverseProxy(backend)
        proxy.ServeHTTP(w, r)
}
相關文章
相關標籤/搜索