1package wire
2
3import (
4	"bytes"
5
6	"github.com/ooni/psiphon/oopsi/github.com/Psiphon-Labs/quic-go/internal/protocol"
7	"github.com/ooni/psiphon/oopsi/github.com/Psiphon-Labs/quic-go/internal/utils"
8)
9
10// A DataBlockedFrame is a DATA_BLOCKED frame
11type DataBlockedFrame struct {
12	DataLimit protocol.ByteCount
13}
14
15func parseDataBlockedFrame(r *bytes.Reader, _ protocol.VersionNumber) (*DataBlockedFrame, error) {
16	if _, err := r.ReadByte(); err != nil {
17		return nil, err
18	}
19	offset, err := utils.ReadVarInt(r)
20	if err != nil {
21		return nil, err
22	}
23	return &DataBlockedFrame{
24		DataLimit: protocol.ByteCount(offset),
25	}, nil
26}
27
28func (f *DataBlockedFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
29	typeByte := uint8(0x14)
30	b.WriteByte(typeByte)
31	utils.WriteVarInt(b, uint64(f.DataLimit))
32	return nil
33}
34
35// Length of a written frame
36func (f *DataBlockedFrame) Length(version protocol.VersionNumber) protocol.ByteCount {
37	return 1 + utils.VarIntLen(uint64(f.DataLimit))
38}
39