github.com/apernet/quic-go@v0.43.1-0.20240515053213-5e9e635fd9f0/internal/wire/new_token_frame.go (about) 1 package wire 2 3 import ( 4 "bytes" 5 "errors" 6 "io" 7 8 "github.com/apernet/quic-go/internal/protocol" 9 "github.com/apernet/quic-go/quicvarint" 10 ) 11 12 // A NewTokenFrame is a NEW_TOKEN frame 13 type NewTokenFrame struct { 14 Token []byte 15 } 16 17 func parseNewTokenFrame(r *bytes.Reader, _ protocol.Version) (*NewTokenFrame, error) { 18 tokenLen, err := quicvarint.Read(r) 19 if err != nil { 20 return nil, err 21 } 22 if uint64(r.Len()) < tokenLen { 23 return nil, io.EOF 24 } 25 if tokenLen == 0 { 26 return nil, errors.New("token must not be empty") 27 } 28 token := make([]byte, int(tokenLen)) 29 if _, err := io.ReadFull(r, token); err != nil { 30 return nil, err 31 } 32 return &NewTokenFrame{Token: token}, nil 33 } 34 35 func (f *NewTokenFrame) Append(b []byte, _ protocol.Version) ([]byte, error) { 36 b = append(b, newTokenFrameType) 37 b = quicvarint.Append(b, uint64(len(f.Token))) 38 b = append(b, f.Token...) 39 return b, nil 40 } 41 42 // Length of a written frame 43 func (f *NewTokenFrame) Length(protocol.Version) protocol.ByteCount { 44 return 1 + protocol.ByteCount(quicvarint.Len(uint64(len(f.Token)))+len(f.Token)) 45 }