forked from quic-go/quic-go
http3: qlog sent and received GOAWAY frames (#5376)
This commit is contained in:
@@ -24,6 +24,10 @@ type RawInfo struct {
|
||||
PayloadLength int // length of the packet payload, excluding AEAD tag
|
||||
}
|
||||
|
||||
func (i RawInfo) HasValues() bool {
|
||||
return i.Length != 0 || i.PayloadLength != 0
|
||||
}
|
||||
|
||||
func (i RawInfo) encode(enc *jsontext.Encoder) error {
|
||||
h := encoderHelper{enc: enc}
|
||||
h.WriteToken(jsontext.BeginObject)
|
||||
@@ -52,9 +56,11 @@ func (e FrameParsed) Encode(enc *jsontext.Encoder, _ time.Time) error {
|
||||
h.WriteToken(jsontext.BeginObject)
|
||||
h.WriteToken(jsontext.String("stream_id"))
|
||||
h.WriteToken(jsontext.Uint(uint64(e.StreamID)))
|
||||
h.WriteToken(jsontext.String("raw"))
|
||||
if err := e.Raw.encode(enc); err != nil {
|
||||
return err
|
||||
if e.Raw.HasValues() {
|
||||
h.WriteToken(jsontext.String("raw"))
|
||||
if err := e.Raw.encode(enc); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
h.WriteToken(jsontext.String("frame"))
|
||||
if err := e.Frame.encode(enc); err != nil {
|
||||
@@ -77,9 +83,11 @@ func (e FrameCreated) Encode(enc *jsontext.Encoder, _ time.Time) error {
|
||||
h.WriteToken(jsontext.BeginObject)
|
||||
h.WriteToken(jsontext.String("stream_id"))
|
||||
h.WriteToken(jsontext.Uint(uint64(e.StreamID)))
|
||||
h.WriteToken(jsontext.String("raw"))
|
||||
if err := e.Raw.encode(enc); err != nil {
|
||||
return err
|
||||
if e.Raw.HasValues() {
|
||||
h.WriteToken(jsontext.String("raw"))
|
||||
if err := e.Raw.encode(enc); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
h.WriteToken(jsontext.String("frame"))
|
||||
if err := e.Frame.encode(enc); err != nil {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package qlog
|
||||
|
||||
import (
|
||||
"github.com/quic-go/quic-go"
|
||||
"github.com/quic-go/quic-go/qlogwriter/jsontext"
|
||||
)
|
||||
|
||||
@@ -15,6 +16,8 @@ func (f Frame) encode(enc *jsontext.Encoder) error {
|
||||
return frame.encode(enc)
|
||||
case HeadersFrame:
|
||||
return frame.encode(enc)
|
||||
case GoAwayFrame:
|
||||
return frame.encode(enc)
|
||||
}
|
||||
// This shouldn't happen if the code is correctly logging frames.
|
||||
// Write a null token to produce valid JSON.
|
||||
@@ -64,3 +67,19 @@ func (f *HeadersFrame) encode(enc *jsontext.Encoder) error {
|
||||
h.WriteToken(jsontext.EndObject)
|
||||
return h.err
|
||||
}
|
||||
|
||||
// A GoAwayFrame is a GOAWAY frame
|
||||
type GoAwayFrame struct {
|
||||
StreamID quic.StreamID
|
||||
}
|
||||
|
||||
func (f *GoAwayFrame) encode(enc *jsontext.Encoder) error {
|
||||
h := encoderHelper{enc: enc}
|
||||
h.WriteToken(jsontext.BeginObject)
|
||||
h.WriteToken(jsontext.String("frame_type"))
|
||||
h.WriteToken(jsontext.String("goaway"))
|
||||
h.WriteToken(jsontext.String("id"))
|
||||
h.WriteToken(jsontext.Uint(uint64(f.StreamID)))
|
||||
h.WriteToken(jsontext.EndObject)
|
||||
return h.err
|
||||
}
|
||||
|
||||
@@ -70,3 +70,10 @@ func TestHeadersFrame(t *testing.T) {
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
func TestGoAwayFrame(t *testing.T) {
|
||||
check(t, GoAwayFrame{StreamID: 1337}, map[string]any{
|
||||
"frame_type": "goaway",
|
||||
"id": 1337,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user