首页 >后端开发 >Golang >反向代理时如何保持 HTTP 请求正文完整性?

反向代理时如何保持 HTTP 请求正文完整性?

Linda Hamilton
Linda Hamilton原创
2024-12-16 04:28:21443浏览

How Can I Preserve HTTP Request Body Integrity When Reverse Proxying?

保留反向代理的 HTTP 请求正文完整性

问题:

在实现 ServeHTTP 方法的自定义 HTTP 处理程序中,使用 req.ParseForm() 检查传入 POST 请求的正文会在请求时导致错误传递给反向代理。发生这种情况是因为读取正文耗尽了 req.Body.Reader 流,没有为后续消费者留下任何内容。

解决方案:

在检查body,请考虑以下技术:

  1. 使用以下方法将请求正文读入缓冲区io.ReadAll(r.Body).
  2. 使用 io.NopCloser(bytes.NewBuffer(buf)) 创建两个新的读取器 rdr1 和 rdr2,由缓冲区支持。
  3. 使用 rdr1检查身体并执行所需的操作。
  4. 将 r.Body 重置为 rdr2 以保留原始状态反向代理的请求状态。

代码示例:

buf, _ := io.ReadAll(r.Body)
rdr1 := io.NopCloser(bytes.NewBuffer(buf))
rdr2 := io.NopCloser(bytes.NewBuffer(buf))

doStuff(rdr1)
r.Body = rdr2 // Resets the request body without consuming any data

注意:

字节。由于缺少 Close() 方法,Buffer 没有实现 io.ReadCloser 接口;因此,每个读者都被包装在 io.NopCloser 中。

以上是反向代理时如何保持 HTTP 请求正文完整性?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn