http3: fix qlog encoding of frame_parsed and frame_created events (#5372)

This commit is contained in:
Marten Seemann
2025-10-11 15:48:05 +08:00
committed by GitHub
parent 115e8ee5d7
commit 53d246840d
4 changed files with 13 additions and 15 deletions

View File

@@ -50,8 +50,6 @@ func (e FrameParsed) Name() string { return "http3:frame_parsed" }
func (e FrameParsed) Encode(enc *jsontext.Encoder, _ time.Time) error {
h := encoderHelper{enc: enc}
h.WriteToken(jsontext.BeginObject)
h.WriteToken(jsontext.String("name"))
h.WriteToken(jsontext.String("frame_parsed"))
h.WriteToken(jsontext.String("stream_id"))
h.WriteToken(jsontext.Uint(uint64(e.StreamID)))
h.WriteToken(jsontext.String("raw"))
@@ -59,7 +57,7 @@ func (e FrameParsed) Encode(enc *jsontext.Encoder, _ time.Time) error {
return err
}
h.WriteToken(jsontext.String("frame"))
if err := e.Frame.Encode(enc); err != nil {
if err := e.Frame.encode(enc); err != nil {
return err
}
h.WriteToken(jsontext.EndObject)
@@ -77,8 +75,6 @@ func (e FrameCreated) Name() string { return "http3:frame_created" }
func (e FrameCreated) Encode(enc *jsontext.Encoder, _ time.Time) error {
h := encoderHelper{enc: enc}
h.WriteToken(jsontext.BeginObject)
h.WriteToken(jsontext.String("name"))
h.WriteToken(jsontext.String("frame_created"))
h.WriteToken(jsontext.String("stream_id"))
h.WriteToken(jsontext.Uint(uint64(e.StreamID)))
h.WriteToken(jsontext.String("raw"))
@@ -86,7 +82,7 @@ func (e FrameCreated) Encode(enc *jsontext.Encoder, _ time.Time) error {
return err
}
h.WriteToken(jsontext.String("frame"))
if err := e.Frame.Encode(enc); err != nil {
if err := e.Frame.encode(enc); err != nil {
return err
}
h.WriteToken(jsontext.EndObject)

View File

@@ -73,7 +73,7 @@ func TestFrameParsedEvent(t *testing.T) {
require.Equal(t, "http3:frame_parsed", name)
require.Equal(t, float64(4), ev["stream_id"])
require.Equal(t, "frame_parsed", ev["name"])
require.NotContains(t, ev, "name")
require.Contains(t, ev, "frame")
}
@@ -93,6 +93,6 @@ func TestFrameCreatedEvent(t *testing.T) {
require.Equal(t, "http3:frame_created", name)
require.Equal(t, float64(8), ev["stream_id"])
require.Equal(t, "frame_created", ev["name"])
require.NotContains(t, ev, "name")
require.Contains(t, ev, "frame")
}

View File

@@ -9,14 +9,16 @@ type Frame struct {
Frame any
}
func (f Frame) Encode(enc *jsontext.Encoder) error {
func (f Frame) encode(enc *jsontext.Encoder) error {
switch frame := f.Frame.(type) {
case *DataFrame:
case DataFrame:
return frame.encode(enc)
case *HeadersFrame:
case HeadersFrame:
return frame.encode(enc)
}
return nil
// This shouldn't happen if the code is correctly logging frames.
// Write a null token to produce valid JSON.
return enc.WriteToken(jsontext.Null)
}
// A DataFrame is a DATA frame

View File

@@ -13,7 +13,7 @@ import (
func check(t *testing.T, f any, expected map[string]any) {
var buf bytes.Buffer
enc := jsontext.NewEncoder(&buf)
require.NoError(t, (Frame{Frame: f}).Encode(enc))
require.NoError(t, (Frame{Frame: f}).encode(enc))
data := buf.Bytes()
require.True(t, json.Valid(data), "invalid JSON: %s", string(data))
checkEncoding(t, data, expected)
@@ -51,13 +51,13 @@ func checkEncoding(t *testing.T, data []byte, expected map[string]any) {
}
func TestDataFrame(t *testing.T) {
check(t, &DataFrame{}, map[string]any{
check(t, DataFrame{}, map[string]any{
"frame_type": "data",
})
}
func TestHeadersFrame(t *testing.T) {
check(t, &HeadersFrame{
check(t, HeadersFrame{
HeaderFields: []HeaderField{
{Name: ":status", Value: "200"},
{Name: "content-type", Value: "application/json"},