Correct way of sending HEADERS and DATA frames in http2?

241 views
Skip to first unread message

Ankit Gupta

unread,
May 23, 2018, 6:41:34 AM5/23/18
to golang-nuts
I am using golang.org/x/net/http2 and golang.org/x/net/http2/hpack packages to do low level http2 framing. For requests with only HEADERS frame sent, I want to send a empy json '{}', so I send 1 HEADERS frame and 1 DATA frame as below 

                headersframe, ok := frame.(*http2.HeadersFrame)
if ok {
println("headers frame detected")

if headersframe.StreamEnded() {
                 
// write HEADERS frame with 2 headers
      
hbytes := make([]byte, 0, 2048)
hbuffer := bytes.NewBuffer(hbytes)
hfield1 := hpack.HeaderField{
Name: ":status",
Value: "200",
Sensitive: false,}
hfield2 := hpack.HeaderField{
Name: "content-type",
Value: "application/json",
Sensitive: false,}

encoder := hpack.NewEncoder(hbuffer)
err := encoder.WriteField(hfield1)
err = encoder.WriteField(hfield2)
if err != nil {
println(err.Error())
}
hfp := http2.HeadersFrameParam{
StreamID: frame.Header().StreamID,
BlockFragment: hbuffer.Bytes(),
EndStream: false,
EndHeaders: true,
}
err = framer.WriteHeaders(hfp)
if err != nil {
println(err.Error())
}

// write DATA frame

data := []byte("{}")
framer.WriteData(frame.Header().StreamID, true, data)
                        }
return
}

On trying with curl -v https://127.0.0.1:8000 -k --http2, I get error as - 

                curl: (16) Error in the HTTP2 framing layer

Is anything missing in my way of framing response?

helio.gu...@gmail.com

unread,
Oct 4, 2019, 5:22:29 PM10/4/19
to golang-nuts
Did you solve this problem?
If so, could I see the code?
I am trying to read the stream's priority field.
Reply all
Reply to author
Forward
0 new messages