1package wire 2 3import ( 4 "bytes" 5 "io" 6 7 "github.com/lucas-clemente/quic-go/internal/protocol" 8 "github.com/lucas-clemente/quic-go/internal/utils" 9) 10 11// A NewTokenFrame is a NEW_TOKEN frame 12type NewTokenFrame struct { 13 Token []byte 14} 15 16func parseNewTokenFrame(r *bytes.Reader, _ protocol.VersionNumber) (*NewTokenFrame, error) { 17 if _, err := r.ReadByte(); err != nil { 18 return nil, err 19 } 20 tokenLen, err := utils.ReadVarInt(r) 21 if err != nil { 22 return nil, err 23 } 24 if uint64(r.Len()) < tokenLen { 25 return nil, io.EOF 26 } 27 token := make([]byte, int(tokenLen)) 28 if _, err := io.ReadFull(r, token); err != nil { 29 return nil, err 30 } 31 return &NewTokenFrame{Token: token}, nil 32} 33 34func (f *NewTokenFrame) Write(b *bytes.Buffer, _ protocol.VersionNumber) error { 35 b.WriteByte(0x7) 36 utils.WriteVarInt(b, uint64(len(f.Token))) 37 b.Write(f.Token) 38 return nil 39} 40 41// Length of a written frame 42func (f *NewTokenFrame) Length(protocol.VersionNumber) protocol.ByteCount { 43 return 1 + utils.VarIntLen(uint64(len(f.Token))) + protocol.ByteCount(len(f.Token)) 44} 45