github.com/apernet/quic-go@v0.43.1-0.20240515053213-5e9e635fd9f0/internal/wire/stop_sending_frame.go (about)

     1  package wire
     2  
     3  import (
     4  	"bytes"
     5  
     6  	"github.com/apernet/quic-go/internal/protocol"
     7  	"github.com/apernet/quic-go/internal/qerr"
     8  	"github.com/apernet/quic-go/quicvarint"
     9  )
    10  
    11  // A StopSendingFrame is a STOP_SENDING frame
    12  type StopSendingFrame struct {
    13  	StreamID  protocol.StreamID
    14  	ErrorCode qerr.StreamErrorCode
    15  }
    16  
    17  // parseStopSendingFrame parses a STOP_SENDING frame
    18  func parseStopSendingFrame(r *bytes.Reader, _ protocol.Version) (*StopSendingFrame, error) {
    19  	streamID, err := quicvarint.Read(r)
    20  	if err != nil {
    21  		return nil, err
    22  	}
    23  	errorCode, err := quicvarint.Read(r)
    24  	if err != nil {
    25  		return nil, err
    26  	}
    27  
    28  	return &StopSendingFrame{
    29  		StreamID:  protocol.StreamID(streamID),
    30  		ErrorCode: qerr.StreamErrorCode(errorCode),
    31  	}, nil
    32  }
    33  
    34  // Length of a written frame
    35  func (f *StopSendingFrame) Length(_ protocol.Version) protocol.ByteCount {
    36  	return 1 + protocol.ByteCount(quicvarint.Len(uint64(f.StreamID))+quicvarint.Len(uint64(f.ErrorCode)))
    37  }
    38  
    39  func (f *StopSendingFrame) Append(b []byte, _ protocol.Version) ([]byte, error) {
    40  	b = append(b, stopSendingFrameType)
    41  	b = quicvarint.Append(b, uint64(f.StreamID))
    42  	b = quicvarint.Append(b, uint64(f.ErrorCode))
    43  	return b, nil
    44  }