代码之家  ›  专栏  ›  技术社区  ›  Sam

在go中解码http2帧头/数据

  •  0
  • Sam  · 技术社区  · 7 年前

    我试图从包含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 as发送请求-

    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路径信息。

    2 回复  |  直到 7 年前
        1
  •  0
  •   sbordet    7 年前

    “头块片段”的编码使用 HPACK .

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

    你可以找到 here 使用编码器和解码器GoAPI的示例。

        2
  •  0
  •   Sam    7 年前

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