如何在golang 1.21中使用EnableFullDuplex()方法

问题描述 投票:0回答:1

正如 Golang documentation 中所述,

EnableFullDuplex()
上的
http.ResponseController
方法允许处理程序在写入响应的同时继续读取请求。

我想编写一个反向代理,设置在客户端前面并将其收到的请求流式传输到目标服务器。我了解这个功能背后的想法,但我不知道如何使用它

我确实理解

httputil.NewSingleHostReverseProxy()
在每隔一段时间传输数据并将其发送到目标服务器,但出于学习目的,我不想使用它,而且它也不会以任何方式利用
EnableFullDuplex()

这就是我所做的:

  1. 我创建了一个 https 服务器:
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
消息,我认为这意味着我在客户端发送文件时得到了写入

对吗?

go streaming reverse-proxy http2 httpserver
1个回答
0
投票

在全双工模式下,应用程序可以在调用响应编写器WriteHeaderWrite方法后从请求正文读取。

当不处于全双工模式(默认)时,应用程序在调用响应写入 WriteHeader 或 Write 方法后无法从请求正文中读取数据。服务器将消耗响应正文的剩余部分,或者如果响应正文很大,则将连接设置为关闭。读取请求正文会返回错误。

要启用全双工模式,只需在调用响应写入器 WriteHeader 或 Write 方法之前调用响应控制器 EnableFullDuplex 方法即可。

在客户端和目标服务之间传输数据不需要全双工模式。非全双工模式时的限制是,在任何响应流式传输回客户端之前,必须将整个请求正文流式传输到目标服务器。

© www.soinside.com 2019 - 2024. All rights reserved.