Расшифровка заголовка / данных кадра http2 в Go - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь прочитать из TCP-соединения, которое содержит данные HTTP / 2.Ниже приведен код для чтения кадра 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

Это вывод, который я получаю (после прочтения предисловия и настроек соединения), еслиЯ прочитал из коннекта, используя приведенный выше код -

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

Я понимаю выходной сигнал, кроме части фрагмента блока и как декодировать его в строку ascii?Я хочу знать информацию о протоколе / методе / пути к URL.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Я понял это с помощью библиотеки 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:*/*
0 голосов
/ 22 мая 2018

«Фрагмент блока заголовка» кодируется с использованием HPACK .

Go имеет реализацию для кодирования и декодирования HPACK, поэтому вам не нужно писать свой собственный.

Вы можете найти здесь пример использования API кодировщика и декодера Go.

...