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  }