解码Go中的http2帧头/数据

解码Go中的http2帧头/数据,http,go,http2,Http,Go,Http2,我试图从包含HTTP/2数据的tcp连接读取数据。下面是用于读取框架标题的代码- 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(

我试图从包含HTTP/2数据的tcp连接读取数据。下面是用于读取框架标题的代码-

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字符串?我想知道协议/方法/url路径信息。

使用对“头块片段”进行编码

Go有一个编码和解码HPACK的实现,所以您不必自己编写


您可以找到同时使用编码器和解码器Go API的示例

我使用Go-hpack库()找到了它

这张照片-

:method:GET
:path:/
:scheme:https
:authority:127.0.0.1:5252
user-agent:curl/7.58.0
accept:*/*

因此,我尝试使用hpack包并执行hpack.huffmandecodestring(headersframe.HeaderBlockFragment()),但这会产生错误{hpack:invalid Huffman encoded data}
:method:GET
:path:/
:scheme:https
:authority:127.0.0.1:5252
user-agent:curl/7.58.0
accept:*/*