【发布时间】:2014-04-14 21:34:13
【问题描述】:
我有一个实现http.Handler 接口的类型,在其ServeHTTP 方法中,检查传入的HTTP 请求,采取一些行动,然后将请求转发到反向代理处理程序(httputil.NewSingleHostReverseProxy)。
只要我只检查基本的请求属性,例如 URL 或标头,这很好用。
当我想检查传入 POST 请求的正文时,例如通过调用req.ParseForm() 然后使用req.Form 属性,一旦将请求传递到反向代理,我就会遇到错误:
http: proxy error: http: Request.ContentLength=687 with Body length 0
我想这是因为查看 HTTP 请求的正文会导致 req.Body.Reader 流被耗尽,这意味着代理处理程序无法再次读取它。
我一直在玩io.Copy() 和bufio.Peek() 之类的东西,但我并没有真正取得任何进展。
有没有办法偷看HTTP请求体(并使用req.ParseForm等的内置解析),同时将原始请求对象保持在原始状态,以便可以将其传递给反向代理?
【问题讨论】:
-
您是否尝试过将
Body替换为像bytes.Reader这样的可搜索阅读器?您可以将Body设置为实现ReadCloser的每个值。 -
未经测试(但值得一试):根据需要制作请求的深层副本,即除了正文和 .*Form 之外的所有内容。然后使用 io.TeeReader 克隆 Request.Body,将其包装在 NopCloser 中并填充到请求的深层副本中。将深层副本传递给反向代理。