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)
}
相关文章
相关标签/搜索