正如 Golang documentation 中所述,
EnableFullDuplex()
上的 http.ResponseController
方法允许处理程序在写入响应的同时继续读取请求。
我想编写一个反向代理,设置在客户端前面并将其收到的请求流式传输到目标服务器。我了解这个功能背后的想法,但我不知道如何使用它
我确实理解
httputil.NewSingleHostReverseProxy()
在每隔一段时间传输数据并将其发送到目标服务器,但出于学习目的,我不想使用它,而且它也不会以任何方式利用EnableFullDuplex()
。
这就是我所做的:
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
rc := http.NewResponseController(w)
_ = rc.EnableFullDuplex()
w.Write([]byte("hello"))
})
http.ListenAndServeTLS(":8080", "./localhost.pem", "./localhost-key.pem", nil)
还有一个 http 客户端发送 2GB 测试文件。从服务器我收到了 2 条
hello
消息,我认为这意味着我在客户端发送文件时得到了写入
对吗?
在全双工模式下,应用程序可以在调用响应编写器WriteHeader或Write方法后从请求正文读取。
当不处于全双工模式(默认)时,应用程序在调用响应写入 WriteHeader 或 Write 方法后无法从请求正文中读取数据。服务器将消耗响应正文的剩余部分,或者如果响应正文很大,则将连接设置为关闭。读取请求正文会返回错误。
要启用全双工模式,只需在调用响应写入器 WriteHeader 或 Write 方法之前调用响应控制器 EnableFullDuplex 方法即可。
在客户端和目标服务之间传输数据不需要全双工模式。非全双工模式时的限制是,在任何响应流式传输回客户端之前,必须将整个请求正文流式传输到目标服务器。