forked from quic-go/quic-go
This function was needed when we supported both Q039 (using big endian encoding) and ealier versions (using little endian encoding).
46 lines
1.2 KiB
Go
46 lines
1.2 KiB
Go
package wire
|
|
|
|
import (
|
|
"bytes"
|
|
|
|
"github.com/lucas-clemente/quic-go/internal/protocol"
|
|
"github.com/lucas-clemente/quic-go/internal/utils"
|
|
)
|
|
|
|
type windowUpdateFrame struct {
|
|
StreamID protocol.StreamID
|
|
ByteOffset protocol.ByteCount
|
|
}
|
|
|
|
// ParseWindowUpdateFrame parses a WINDOW_UPDATE frame
|
|
// The frame returned is
|
|
// * a MAX_STREAM_DATA frame, if the WINDOW_UPDATE applies to a stream
|
|
// * a MAX_DATA frame, if the WINDOW_UPDATE applies to the connection
|
|
func ParseWindowUpdateFrame(r *bytes.Reader, _ protocol.VersionNumber) (Frame, error) {
|
|
if _, err := r.ReadByte(); err != nil { // read the TypeByte
|
|
return nil, err
|
|
}
|
|
streamID, err := utils.BigEndian.ReadUint32(r)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
offset, err := utils.BigEndian.ReadUint64(r)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if streamID == 0 {
|
|
return &MaxDataFrame{ByteOffset: protocol.ByteCount(offset)}, nil
|
|
}
|
|
return &MaxStreamDataFrame{
|
|
StreamID: protocol.StreamID(streamID),
|
|
ByteOffset: protocol.ByteCount(offset),
|
|
}, nil
|
|
}
|
|
|
|
func (f *windowUpdateFrame) Write(b *bytes.Buffer, _ protocol.VersionNumber) error {
|
|
b.WriteByte(0x4)
|
|
utils.BigEndian.WriteUint32(b, uint32(f.StreamID))
|
|
utils.BigEndian.WriteUint64(b, uint64(f.ByteOffset))
|
|
return nil
|
|
}
|