当前位置: 首页 > 知识库问答 >
问题:

读取http的主体。不修改请求状态的请求?

束涵涤
2023-03-14

我有一个实现http的类型。Handler接口,在其ServeHTTP方法中,检查传入的HTTP请求,采取一些操作,然后将请求转发到反向代理处理程序(httputil.NewSingleHostReverseProxy)。

只要我只检查基本请求属性(如URL或标头),就可以正常工作。

当我想检查传入POST请求的主体时,例如通过调用req。ParseForm()然后使用req。Form属性,一旦请求传递到反向代理,我就会遇到错误:

http:proxy错误:http:Request。ContentLength=687,正文长度为0

我认为这是因为查看HTTP请求的主体会导致req。身体读卡器要排空的流,这意味着代理处理程序无法再次读取该流。

我一直在玩io之类的东西。复制()bufio。Peek(),但我真的没有什么进展。

有没有办法偷看HTTP请求主体(并使用req的内置解析)。ParseForm等),同时将原始请求对象保持在其原始状态,以便可以将其传递给反向代理?

共有2个答案

楮星鹏
2023-03-14

最近我用了一种不同的方法。有一个可用的GetBody方法,您可以通过该方法获取请求正文的新副本,因此不必执行以下操作:

doStuff(r.Body)

你可以改为:

body, _ := r.GetBody()
doStuff(body)
// r.Body is unmodified

这允许您在检查请求主体的同时仍保留它,以便稍后进行进一步处理

尹雅健
2023-03-14

尝试读取缓冲区,然后使用缓冲区备份两个新读取器,一个供您使用,一个供后续消费者使用。例如,假设我们要修改以下代码:

doStuff(r.Body) // r is an http.Request

我们可以做到:

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

doStuff(rdr1)
r.Body = rdr2 // OK since rdr2 implements the io.ReadCloser interface

// Now the program can continue oblivious to the fact that
// r.Body was ever touched.

请注意,*字节。缓冲区没有Close()错误方法,因此它不实现io。ReadCloser界面。因此,我们必须包装*字节。调用ioutil时缓冲区值。NoCloser

 类似资料:
  • 问题内容: 我有一个实现接口的类型,该接口在其方法中检查传入的HTTP请求,采取某些措施,然后将请求转发到反向代理处理程序()。 只要我仅检查基本的请求属性(例如URL或标头),此方法就可以正常工作。 当我想检查传入的POST请求的主体(例如,通过调用然后使用属性)时,将请求传递到反向代理后,就会遇到错误: 我认为发生这种情况是因为查看HTTP请求的正文会导致流被耗尽,这意味着代理处理程序无法再次

  • 我在使用MyEclipse IDE中的Tomcat服务器和Struts 2框架时遇到了一个反复出现的问题。我正在运行我的程序作为一个服务器应用程序,当它运行时,默认的index.jsp文件将成功打开,但该应用程序的其他过去都将无法工作。当试图加载任何我的。do页面,我得到以下错误:HTTP状态404:请求的资源....不可用。当我以前遇到这个错误时,我只是重启了服务器,一切都很好,但是我现在没有同

  • 当我开始login.jsp表单并键入用户名和密码时,我有这个错误错误错误是HTTP状态404:请求的资源不可用。 我错过了什么?有什么帮助吗? 登录。JAVA 登录。jsp Web.xml Struts配置 这就是我http://www.tutorialspoint.com/struts_2/struts_database_access.htm

  • 一、修改请求 在上一步中,我们恢复了截获的请求,没有进行任何更改。当我们在将请求转发到目的地之前修改被拦截的请求时,就会发挥拦截的全部功能。您可以继续上一步中的窗口和已配置的拦截规则。 欢迎来到mitmproxy教程。在本课程中,我们将介绍对截获请求的修改。 点击查看教程 二、影片内容 欢迎来到mitmproxy教程。在本课程中,我们将介绍对截获请求的修改。 我们配置和使用与上一教程中相同的拦截规

  • 问题内容: 在Tomcat服务器上运行Eclipse项目时出现以下错误: HTTP状态404-请求的资源(/ ProjectName /)不可用。 浏览器地址栏中的URL为。 我真的不知道文件中缺少什么。我在文件夹中有一个,并且我的包含以下条目: 问题答案: 默认情况下,当您打开项目根文件夹而不是中的物理文件时,服务器将在中查找欢迎文件。如果未找到任何内容,则将出现此404“找不到页面”错误。 就

  • 自1.14.0开始,zuul网关支持动态修改请求参数。即在网关修改客户端传递过来的参数,然后发送到微服务端。 客户端参数{"name": "jim"} --> zuul中修改为{"name": "Lucy"} --> 微服务端将收到{"name": "Lucy"} 使用场景:客户端请求参数经过加密,在网关解密后,再次发送明文参数给微服务端 如何使用 在网关springboot启动函数中添加如下代