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