go语言自带包ReverseProxy 实现了proxy的功能。
但我希望proxy进程能够在代理的同时,完整的把请求和请求体记录在日志里。
仅使用ReverseProxy 包的话,uri记录没问题,但body只能被读取一次,proxy将body记录在日志,那么backend就没办法再读body了。
因此需要proxy进程读过一次body之后,把数据重新写回去,留给backend读取。
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)
}