go x/net/http2: support proxying udp in HTTP

9ceoxa92  于 4个月前  发布在  Go
关注(0)|答案(5)|浏览(36)

Go版本

go版本:go1.21.1 darwin/amd64

在你的模块/工作区中go env的输出:

GO111MODULE=''
GOARCH='amd64'
GOBIN=''
GOCACHE='/Users/nmaharja/Library/Caches/go-build'
GOENV='/Users/nmaharja/Library/Application Support/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS='-buildvcs=false'
GOHOSTARCH='amd64'
GOHOSTOS='darwin'
GOINSECURE=''
GOMODCACHE='/Users/nmaharja/go/pkg/mod'
GONOPROXY='github.office.opendns.com'
GONOSUMDB='github.office.opendns.com'
GOOS='darwin'
GOPATH='/Users/nmaharja/go'
GOPRIVATE='github.office.opendns.com'
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/usr/local/go'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/local/go/pkg/tool/darwin_amd64'
GOVCS=''
GOVERSION='go1.21.1'
GCCGO='gccgo'
GOAMD64='v1'
AR='ar'
CC='clang'
CXX='clang++'
CGO_ENABLED='1'
GOMOD='/Users/nmaharja/projects/clean/ProxyConnectTools/go.mod'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-prefix-map=/var/folders/fv/c8jghnc95_vgn57t5w9hvvlh0000gn/T/go-build1530722529=/tmp/go-build -gno-record-gcc-switches -fno-common'

你做了什么?

我尝试通过HTTP2协议创建一个UDP连接。对于HTTP2连接,RFC建议使用CONNECT方法并设置以下头信息

HEADERS
   :method = CONNECT
   :protocol = connect-udp
   :scheme = https
   :path = /.well-known/masque/udp/192.0.2.6/443/
   :authority = example.org

我没有看到设置protocolschemepath头信息。当不使用encodeHeaders方法时,schemepath方法只设置了CONNECT
RFC文档链接: https://datatracker.ietf.org/doc/rfc9298/

你看到了什么发生?

服务器决定使用TCP协议而不是UDP。

你期望看到什么?

我期望看到UDP连接。

gupuwyp2

gupuwyp21#

更新,事实证明,如果我使用除了"CONNECT"之外的其他方法,我可以通过仅包含头部信息的UDP连接。

:scheme = https
:path = /.well-known/masque/udp/192.0.2.6/443/

但这可能只适用于我的特定情况。因为RFC期望在CONNECT方法上使用UDP连接。

aiazj4mn

aiazj4mn3#

对不起,我不太明白这里的具体要求是什么。你是要实现RFC 9298,还是希望net/http的某个部分直接支持它?

在HTTP/2中使用net/http实现RFC 9298的一个障碍是,我们目前缺乏对Extended CONNECT(RFC 8441)的支持。有一个已接受的提案来添加Extended CONNECT支持(#53208),但尚未实施。

cnjp1d6j

cnjp1d6j5#

对不起,我不太明白这里的具体要求是什么。你是要实现RFC 9298,还是希望net/http的某个部分直接支持它?

在HTTP/2中使用net/http实现RFC 9298的一个障碍是,我们目前缺乏对Extended CONNECT(RFC 8441)的支持。有一个被接受的提案来添加Extended CONNECT支持(#53208),但尚未实现。

是的,我原本以为这里会支持RFC 9298。我理解不同的HTTP2 UDP隧道实现似乎遵循不同的标准。就我的用例而言,我使用了"CONNECT-UDP",这添加了所需的两个头部":"scheme"和":path",代理服务器暂时决定使用UDP隧道。RFC 9298期望我使用"CONNECT",这是我的困惑所在。

相关问题