forked from quic-go/quic-go
refactor packet unpacking
This replaces version.UsesMaxDataFrame by versoin.UsesIETFFrameFormat. That way, we can have two separate code paths in the unpacker to unpack either gQUIC frames or IETF frames.
This commit is contained in:
@@ -18,7 +18,7 @@ func ParseBlockedFrame(r *bytes.Reader, version protocol.VersionNumber) (*Blocke
|
||||
}
|
||||
|
||||
func (f *BlockedFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
|
||||
if !version.UsesMaxDataFrame() {
|
||||
if !version.UsesIETFFrameFormat() {
|
||||
return (&blockedFrameLegacy{}).Write(b, version)
|
||||
}
|
||||
typeByte := uint8(0x08)
|
||||
@@ -28,7 +28,7 @@ func (f *BlockedFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) er
|
||||
|
||||
// MinLength of a written frame
|
||||
func (f *BlockedFrame) MinLength(version protocol.VersionNumber) (protocol.ByteCount, error) {
|
||||
if !version.UsesMaxDataFrame() { // writing this frame would result in a legacy BLOCKED being written, which is longer
|
||||
if !version.UsesIETFFrameFormat() { // writing this frame would result in a legacy BLOCKED being written, which is longer
|
||||
return 1 + 4, nil
|
||||
}
|
||||
return 1, nil
|
||||
|
||||
@@ -35,7 +35,7 @@ var _ = Describe("BLOCKED frame", func() {
|
||||
|
||||
It("has the correct min length", func() {
|
||||
frame := BlockedFrame{}
|
||||
Expect(frame.MinLength(versionMaxDataFrame)).To(Equal(protocol.ByteCount(1)))
|
||||
Expect(frame.MinLength(versionIETFFrames)).To(Equal(protocol.ByteCount(1)))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -30,7 +30,7 @@ func ParseMaxDataFrame(r *bytes.Reader, version protocol.VersionNumber) (*MaxDat
|
||||
|
||||
//Write writes a MAX_STREAM_DATA frame
|
||||
func (f *MaxDataFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
|
||||
if !version.UsesMaxDataFrame() {
|
||||
if !version.UsesIETFFrameFormat() {
|
||||
// write a gQUIC WINDOW_UPDATE frame (with stream ID 0, which means connection-level there)
|
||||
return (&windowUpdateFrame{
|
||||
StreamID: 0,
|
||||
@@ -44,7 +44,7 @@ func (f *MaxDataFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) er
|
||||
|
||||
// MinLength of a written frame
|
||||
func (f *MaxDataFrame) MinLength(version protocol.VersionNumber) (protocol.ByteCount, error) {
|
||||
if !version.UsesMaxDataFrame() { // writing this frame would result in a gQUIC WINDOW_UPDATE being written, which is longer
|
||||
if !version.UsesIETFFrameFormat() { // writing this frame would result in a gQUIC WINDOW_UPDATE being written, which is longer
|
||||
return 1 + 4 + 8, nil
|
||||
}
|
||||
return 1 + 8, nil
|
||||
|
||||
@@ -24,10 +24,10 @@ var _ = Describe("MAX_DATA frame", func() {
|
||||
data := []byte{0x4,
|
||||
0x44, 0x33, 0x22, 0x11, 0xad, 0xfb, 0xca, 0xde, // byte offset
|
||||
}
|
||||
_, err := ParseMaxDataFrame(bytes.NewReader(data), versionMaxDataFrame)
|
||||
_, err := ParseMaxDataFrame(bytes.NewReader(data), versionIETFFrames)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
for i := range data {
|
||||
_, err := ParseMaxDataFrame(bytes.NewReader(data[0:i]), versionMaxDataFrame)
|
||||
_, err := ParseMaxDataFrame(bytes.NewReader(data[0:i]), versionIETFFrames)
|
||||
Expect(err).To(HaveOccurred())
|
||||
}
|
||||
})
|
||||
@@ -38,7 +38,7 @@ var _ = Describe("MAX_DATA frame", func() {
|
||||
f := &MaxDataFrame{
|
||||
ByteOffset: 0xdeadbeef,
|
||||
}
|
||||
Expect(f.MinLength(versionMaxDataFrame)).To(Equal(protocol.ByteCount(1 + 8)))
|
||||
Expect(f.MinLength(versionIETFFrames)).To(Equal(protocol.ByteCount(1 + 8)))
|
||||
})
|
||||
|
||||
It("writes a MAX_DATA frame", func() {
|
||||
@@ -46,7 +46,7 @@ var _ = Describe("MAX_DATA frame", func() {
|
||||
f := &MaxDataFrame{
|
||||
ByteOffset: 0xdeadbeefcafe1337,
|
||||
}
|
||||
err := f.Write(b, versionMaxDataFrame)
|
||||
err := f.Write(b, versionIETFFrames)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(b.Bytes()).To(Equal([]byte{0x4,
|
||||
0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37, // byte offset
|
||||
|
||||
@@ -38,7 +38,7 @@ func ParseMaxStreamDataFrame(r *bytes.Reader, version protocol.VersionNumber) (*
|
||||
|
||||
// Write writes a MAX_STREAM_DATA frame
|
||||
func (f *MaxStreamDataFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
|
||||
if !version.UsesMaxDataFrame() {
|
||||
if !version.UsesIETFFrameFormat() {
|
||||
return (&windowUpdateFrame{
|
||||
StreamID: f.StreamID,
|
||||
ByteOffset: f.ByteOffset,
|
||||
|
||||
@@ -15,7 +15,7 @@ var _ = Describe("MAX_STREAM_DATA frame", func() {
|
||||
0xde, 0xad, 0xbe, 0xef, // stream id
|
||||
0xde, 0xca, 0xfb, 0xad, 0x11, 0x22, 0x33, 0x44, // byte offset
|
||||
})
|
||||
frame, err := ParseMaxStreamDataFrame(b, versionMaxDataFrame)
|
||||
frame, err := ParseMaxStreamDataFrame(b, versionIETFFrames)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(frame.StreamID).To(Equal(protocol.StreamID(0xdeadbeef)))
|
||||
Expect(frame.ByteOffset).To(Equal(protocol.ByteCount(0xdecafbad11223344)))
|
||||
@@ -27,10 +27,10 @@ var _ = Describe("MAX_STREAM_DATA frame", func() {
|
||||
0xef, 0xbe, 0xad, 0xde, // stream id
|
||||
0x44, 0x33, 0x22, 0x11, 0xad, 0xfb, 0xca, 0xde, // byte offset
|
||||
}
|
||||
_, err := ParseMaxStreamDataFrame(bytes.NewReader(data), versionMaxDataFrame)
|
||||
_, err := ParseMaxStreamDataFrame(bytes.NewReader(data), versionIETFFrames)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
for i := range data {
|
||||
_, err := ParseMaxStreamDataFrame(bytes.NewReader(data[0:i]), versionMaxDataFrame)
|
||||
_, err := ParseMaxStreamDataFrame(bytes.NewReader(data[0:i]), versionIETFFrames)
|
||||
Expect(err).To(HaveOccurred())
|
||||
}
|
||||
})
|
||||
@@ -51,7 +51,7 @@ var _ = Describe("MAX_STREAM_DATA frame", func() {
|
||||
StreamID: 0xdecafbad,
|
||||
ByteOffset: 0xdeadbeefcafe1337,
|
||||
}
|
||||
err := f.Write(b, versionMaxDataFrame)
|
||||
err := f.Write(b, versionIETFFrames)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(b.Bytes()).To(Equal([]byte{0x5,
|
||||
0xde, 0xca, 0xfb, 0xad, // stream id
|
||||
|
||||
@@ -30,7 +30,7 @@ func ParseStreamBlockedFrame(r *bytes.Reader, version protocol.VersionNumber) (*
|
||||
|
||||
// Write writes a STREAM_BLOCKED frame
|
||||
func (f *StreamBlockedFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
|
||||
if !version.UsesMaxDataFrame() {
|
||||
if !version.UsesIETFFrameFormat() {
|
||||
return (&blockedFrameLegacy{StreamID: f.StreamID}).Write(b, version)
|
||||
}
|
||||
b.WriteByte(0x09)
|
||||
|
||||
@@ -15,7 +15,7 @@ var _ = Describe("STREAM_BLOCKED frame", func() {
|
||||
b := bytes.NewReader([]byte{0x9,
|
||||
0xde, 0xad, 0xbe, 0xef, // stream id
|
||||
})
|
||||
frame, err := ParseStreamBlockedFrame(b, versionMaxDataFrame)
|
||||
frame, err := ParseStreamBlockedFrame(b, versionIETFFrames)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(frame.StreamID).To(Equal(protocol.StreamID(0xdeadbeef)))
|
||||
Expect(b.Len()).To(BeZero())
|
||||
@@ -25,10 +25,10 @@ var _ = Describe("STREAM_BLOCKED frame", func() {
|
||||
data := []byte{0x9,
|
||||
0xef, 0xbe, 0xad, 0xde, // stream id
|
||||
}
|
||||
_, err := ParseStreamBlockedFrame(bytes.NewReader(data), versionMaxDataFrame)
|
||||
_, err := ParseStreamBlockedFrame(bytes.NewReader(data), versionIETFFrames)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
for i := range data {
|
||||
_, err := ParseStreamBlockedFrame(bytes.NewReader(data[0:i]), versionMaxDataFrame)
|
||||
_, err := ParseStreamBlockedFrame(bytes.NewReader(data[0:i]), versionIETFFrames)
|
||||
Expect(err).To(HaveOccurred())
|
||||
}
|
||||
})
|
||||
@@ -47,7 +47,7 @@ var _ = Describe("STREAM_BLOCKED frame", func() {
|
||||
f := &StreamBlockedFrame{
|
||||
StreamID: 0xdecafbad,
|
||||
}
|
||||
err := f.Write(b, versionMaxDataFrame)
|
||||
err := f.Write(b, versionIETFFrames)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(b.Bytes()).To(Equal([]byte{0x9,
|
||||
0xde, 0xca, 0xfb, 0xad, // stream id
|
||||
|
||||
@@ -17,13 +17,13 @@ func TestCrypto(t *testing.T) {
|
||||
const (
|
||||
// a QUIC version that uses big endian encoding
|
||||
versionBigEndian = protocol.Version39
|
||||
// a QUIC version that uses the MAX_DATA / MAX_STREAM_DATA and BLOCKED / STREAM_BLOCKED frames
|
||||
versionMaxDataFrame = protocol.VersionTLS
|
||||
// a QUIC version that uses the IETF frame types
|
||||
versionIETFFrames = protocol.VersionTLS
|
||||
)
|
||||
|
||||
var _ = BeforeSuite(func() {
|
||||
Expect(utils.GetByteOrder(versionBigEndian)).To(Equal(utils.BigEndian))
|
||||
Expect(utils.GetByteOrder(versionMaxDataFrame)).To(Equal(utils.BigEndian))
|
||||
Expect(versionBigEndian.UsesMaxDataFrame()).To(BeFalse())
|
||||
Expect(versionMaxDataFrame.UsesMaxDataFrame()).To(BeTrue())
|
||||
Expect(utils.GetByteOrder(versionIETFFrames)).To(Equal(utils.BigEndian))
|
||||
Expect(versionBigEndian.UsesIETFFrameFormat()).To(BeFalse())
|
||||
Expect(versionIETFFrames.UsesIETFFrameFormat()).To(BeTrue())
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user