go语言实现http proxy的关键一步

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

转载于:https://my.oschina.net/u/3730750/blog/1834073

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值