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) }