在 Go 中解码 http2 帧 header/data
Decoding http2 frame header/data in Go
我正在尝试从包含 HTTP/2 数据的 TCP 连接中读取数据。下面是读取 HEADERS 框架的代码 -
framer := http2.NewFramer(conn, conn)
frame, _ := framer.ReadFrame()
fmt.Printf("fh type: %s\n", frame.Header().Type)
fmt.Printf("fh type: %d\n", frame.Header().Type)
fmt.Printf("fh flag: %d\n", frame.Header().Flags)
fmt.Printf("fh length: %d\n", frame.Header().Length)
fmt.Printf("fh streamid: %d\n", frame.Header().StreamID)
headersframe := (frame1.(*http2.HeadersFrame))
fmt.Printf("stream ended? %v\n", headersframe.StreamEnded())
fmt.Printf("block fragment: %x\n", headersframe.HeaderBlockFragment())
我使用 curl 发送请求 -
curl -v https://127.0.0.1:8000/ -k --http2
这是我得到的输出(在阅读连接前言和设置之后),如果我使用上面的代码从 conn 读取 -
fh type: HEADERS
fh type: 1
fh flag: 5
fh length: 30
fh streamid: 1
stream ended? true
block fragment: 828487418a089d5c0b8170dc6c4d8b7a8825b650c3abb6f2e053032a2f2a
我理解输出,除了 块片段 部分以及如何将其解码为 ascii 字符串?我想知道 protocol/method/url 路径信息。
“头块片段”使用HPACK编码。
Go 有一个编码和解码 HPACK 的实现,因此您不必自己编写。
您可以找到 here 同时使用编码器和解码器 Go 的示例 API。
我使用 Go hpack 库解决了这个问题 (https://godoc.org/golang.org/x/net/http2/hpack) -
decoder := hpack.NewDecoder(2048, nil)
hf, _ := decoder.DecodeFull(headersframe.HeaderBlockFragment())
for _, h := range hf {
fmt.Printf("%s\n", h.Name + ":" + h.Value)
}
这会打印 -
:method:GET
:path:/
:scheme:https
:authority:127.0.0.1:5252
user-agent:curl/7.58.0
accept:*/*
我正在尝试从包含 HTTP/2 数据的 TCP 连接中读取数据。下面是读取 HEADERS 框架的代码 -
framer := http2.NewFramer(conn, conn)
frame, _ := framer.ReadFrame()
fmt.Printf("fh type: %s\n", frame.Header().Type)
fmt.Printf("fh type: %d\n", frame.Header().Type)
fmt.Printf("fh flag: %d\n", frame.Header().Flags)
fmt.Printf("fh length: %d\n", frame.Header().Length)
fmt.Printf("fh streamid: %d\n", frame.Header().StreamID)
headersframe := (frame1.(*http2.HeadersFrame))
fmt.Printf("stream ended? %v\n", headersframe.StreamEnded())
fmt.Printf("block fragment: %x\n", headersframe.HeaderBlockFragment())
我使用 curl 发送请求 -
curl -v https://127.0.0.1:8000/ -k --http2
这是我得到的输出(在阅读连接前言和设置之后),如果我使用上面的代码从 conn 读取 -
fh type: HEADERS
fh type: 1
fh flag: 5
fh length: 30
fh streamid: 1
stream ended? true
block fragment: 828487418a089d5c0b8170dc6c4d8b7a8825b650c3abb6f2e053032a2f2a
我理解输出,除了 块片段 部分以及如何将其解码为 ascii 字符串?我想知道 protocol/method/url 路径信息。
“头块片段”使用HPACK编码。
Go 有一个编码和解码 HPACK 的实现,因此您不必自己编写。
您可以找到 here 同时使用编码器和解码器 Go 的示例 API。
我使用 Go hpack 库解决了这个问题 (https://godoc.org/golang.org/x/net/http2/hpack) -
decoder := hpack.NewDecoder(2048, nil)
hf, _ := decoder.DecodeFull(headersframe.HeaderBlockFragment())
for _, h := range hf {
fmt.Printf("%s\n", h.Name + ":" + h.Value)
}
这会打印 -
:method:GET
:path:/
:scheme:https
:authority:127.0.0.1:5252
user-agent:curl/7.58.0
accept:*/*