Golang TCP 服务器读取 HTTP/2 帧

我正在尝试设置一个接受和解码 HTTP/2 数据的 TCP 服务器。实际解析帧的代码可以在这篇文章中找到:

在 Go 中解码 http2 帧头/数据

但是,我在设置服务器时遇到问题。连接被接受,但挂起framer.ReadFrame()。这是一个代码示例:

// generate with: openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.pem -days 365 -nodes

cert, err := tls.LoadX509KeyPair("server.pem", "server.key")

if err != nil {

    log.Fatal(err)

}


tlsCfg := &tls.Config{

    Certificates: []tls.Certificate{cert},

    NextProtos:   []string{"h2"},

}


l, err := tls.Listen("tcp", ":8787", tlsCfg)

if err != nil {

    log.Fatal(err)

}

defer l.Close()


conn, err := l.Accept()

if err != nil {

    log.Fatalln(err)

}

defer conn.Close()


framer := http2.NewFramer(conn, conn)

frame, _ := framer.ReadFrame() // Here it hangs

我使用 curl 请求服务器


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


一只名叫tom的猫
浏览 225回答 1
1回答

MYYA

对话不是从框架开始的。首先客户端发送字符串"PRI&nbsp;*&nbsp;HTTP/2.0\r\n\r\nSM\r\n\r\n"您可以通过检查客户端发送的字节来判断:framer := http2.NewFramer(conn, io.TeeReader(conn, hex.Dumper(os.Stdout)))// 00000000&nbsp; 50 52 49 20 2a 20 48 54&nbsp; 54 50 2f 32 2e 30 0d 0a&nbsp; |PRI * HTTP/2.0..|// 00000010&nbsp; 0d 0a 53 4d 0d 0a 0d 0a&nbsp; 00 00 12 04 00 00 00 00&nbsp; |..SM............|// 00000020&nbsp; 00 00 03 00 00 00 64 00&nbsp; 04 40 00 00 00 00 02 00&nbsp; |......d..@......|// 00000030&nbsp; 00 00 00 00 00 04 08 00&nbsp; 00 00 00 00 3f ff 00 01&nbsp; |............?...|// 00000040&nbsp; 00 00 1e 01 05 00 00 00&nbsp; 01 82 84 87 41 8a a0 e4&nbsp; |............A...|// 00000050&nbsp; 1d 13 9d 09 b8 f3 af 3b&nbsp; 7a 88 25 b6 50 c3 ab b6&nbsp; |.......;z.%.P...|// 00000060&nbsp; fa e0 53 03 2a 2f 2a ^C如果您修改代码以首先读取该字符串,它会按预期工作:conn, err := l.Accept()if err != nil {&nbsp; &nbsp; log.Fatalln(err)}&nbsp; &nbsp;defer conn.Close()const preface = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"b := make([]byte, len(preface))if _, err := io.ReadFull(conn, b); err != nil {&nbsp; &nbsp; log.Fatalln(err)}if string(b) != preface {&nbsp; &nbsp; log.Fatalln("invalid preface")}framer := http2.NewFramer(conn, conn)frame, err := framer.ReadFrame()fmt.Println(frame, err)// Output:// [FrameHeader SETTINGS len=18] <nil>如果发现这些文章在我自己使用 HTTP2 时有用:https://developers.google.com/web/fundamentals/performance/http2/http://undertow.io/blog/2015/04/27/An-in-depth-overview-of-HTTP2.html
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go