github.com/mikelsr/quic-go@v0.36.1-0.20230701132136-1d9415b66898/internal/handshake/session_ticket.go (about) 1 package handshake 2 3 import ( 4 "bytes" 5 "errors" 6 "fmt" 7 "time" 8 9 "github.com/mikelsr/quic-go/internal/wire" 10 "github.com/mikelsr/quic-go/quicvarint" 11 ) 12 13 const sessionTicketRevision = 3 14 15 type sessionTicket struct { 16 Parameters *wire.TransportParameters 17 RTT time.Duration // to be encoded in mus 18 } 19 20 func (t *sessionTicket) Marshal() []byte { 21 b := make([]byte, 0, 256) 22 b = quicvarint.Append(b, sessionTicketRevision) 23 b = quicvarint.Append(b, uint64(t.RTT.Microseconds())) 24 return t.Parameters.MarshalForSessionTicket(b) 25 } 26 27 func (t *sessionTicket) Unmarshal(b []byte) error { 28 r := bytes.NewReader(b) 29 rev, err := quicvarint.Read(r) 30 if err != nil { 31 return errors.New("failed to read session ticket revision") 32 } 33 if rev != sessionTicketRevision { 34 return fmt.Errorf("unknown session ticket revision: %d", rev) 35 } 36 rtt, err := quicvarint.Read(r) 37 if err != nil { 38 return errors.New("failed to read RTT") 39 } 40 var tp wire.TransportParameters 41 if err := tp.UnmarshalFromSessionTicket(r); err != nil { 42 return fmt.Errorf("unmarshaling transport parameters from session ticket failed: %s", err.Error()) 43 } 44 t.Parameters = &tp 45 t.RTT = time.Duration(rtt) * time.Microsecond 46 return nil 47 }