在Go中解码http2帧头/数据

时间:2018-05-22 07:51:37

标签: http go http2

我试图从包含HTTP / 2数据的tcp连接中读取。以下是阅读HEADERS框架的代码 -

curl -v https://127.0.0.1:8000/ -k --http2

我使用curl发送请求为 -

fh type: HEADERS
fh type: 1
fh flag: 5
fh length: 30
fh streamid: 1
stream ended? true
block fragment: 828487418a089d5c0b8170dc6c4d8b7a8825b650c3abb6f2e053032a2f2a

这是我得到的输出(在阅读连接前言和设置之后),如果我使用上面的代码从conn读取 -

JavaAppPackaging

我理解输出,除了块片段部分以及如何将其解码为ascii字符串?我想知道protocol / method / url路径信息。

2 个答案:

答案 0 :(得分:0)

“标题块片段”使用HPACK进行编码。

Go有一个编码和解码HPACK的实现,因此您不必自己编写。

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

答案 1 :(得分:0)

我使用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:*/*