forked from quic-go/quic-go
http3: add basic server-side qlog support (#5367)
* add Conn.QlogTrace * http3: add basic qlog support on the server side
This commit is contained in:
94
http3/qlog/event.go
Normal file
94
http3/qlog/event.go
Normal file
@@ -0,0 +1,94 @@
|
||||
package qlog
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/quic-go/quic-go"
|
||||
"github.com/quic-go/quic-go/qlogwriter/jsontext"
|
||||
)
|
||||
|
||||
type encoderHelper struct {
|
||||
enc *jsontext.Encoder
|
||||
err error
|
||||
}
|
||||
|
||||
func (h *encoderHelper) WriteToken(t jsontext.Token) {
|
||||
if h.err != nil {
|
||||
return
|
||||
}
|
||||
h.err = h.enc.WriteToken(t)
|
||||
}
|
||||
|
||||
type RawInfo struct {
|
||||
Length int // full packet length, including header and AEAD authentication tag
|
||||
PayloadLength int // length of the packet payload, excluding AEAD tag
|
||||
}
|
||||
|
||||
func (i RawInfo) encode(enc *jsontext.Encoder) error {
|
||||
h := encoderHelper{enc: enc}
|
||||
h.WriteToken(jsontext.BeginObject)
|
||||
if i.Length != 0 {
|
||||
h.WriteToken(jsontext.String("length"))
|
||||
h.WriteToken(jsontext.Uint(uint64(i.Length)))
|
||||
}
|
||||
if i.PayloadLength != 0 {
|
||||
h.WriteToken(jsontext.String("payload_length"))
|
||||
h.WriteToken(jsontext.Uint(uint64(i.PayloadLength)))
|
||||
}
|
||||
h.WriteToken(jsontext.EndObject)
|
||||
return h.err
|
||||
}
|
||||
|
||||
type FrameParsed struct {
|
||||
StreamID quic.StreamID
|
||||
Raw RawInfo
|
||||
Frame Frame
|
||||
}
|
||||
|
||||
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"))
|
||||
if err := e.Raw.encode(enc); err != nil {
|
||||
return err
|
||||
}
|
||||
h.WriteToken(jsontext.String("frame"))
|
||||
if err := e.Frame.Encode(enc); err != nil {
|
||||
return err
|
||||
}
|
||||
h.WriteToken(jsontext.EndObject)
|
||||
return h.err
|
||||
}
|
||||
|
||||
type FrameCreated struct {
|
||||
StreamID quic.StreamID
|
||||
Raw RawInfo
|
||||
Frame Frame
|
||||
}
|
||||
|
||||
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"))
|
||||
if err := e.Raw.encode(enc); err != nil {
|
||||
return err
|
||||
}
|
||||
h.WriteToken(jsontext.String("frame"))
|
||||
if err := e.Frame.Encode(enc); err != nil {
|
||||
return err
|
||||
}
|
||||
h.WriteToken(jsontext.EndObject)
|
||||
return h.err
|
||||
}
|
||||
Reference in New Issue
Block a user