check for maximum packet size when packing control frames

This commit is contained in:
Marten Seemann
2016-04-27 11:40:20 +07:00
parent 160db13bdb
commit 67a36870ea
2 changed files with 39 additions and 36 deletions

View File

@@ -111,6 +111,10 @@ func (p *packetPacker) composeNextPacket(controlFrames []frames.Frame, includeSt
controlFrames = controlFrames[1:]
}
if payloadLength > protocol.MaxFrameSize {
panic("internal inconsistency: packet payload too large")
}
if !includeStreamFrames {
return payloadFrames, nil
}

View File

@@ -60,44 +60,22 @@ var _ = Describe("Packet packer", func() {
Expect(p.raw).NotTo(HaveLen(0))
})
It("packs multiple stream frames into single packet", func() {
f1 := frames.StreamFrame{
StreamID: 5,
Data: []byte{0xDE, 0xCA, 0xFB, 0xAD},
}
f2 := frames.StreamFrame{
StreamID: 5,
Data: []byte{0xBE, 0xEF, 0x13, 0x37},
}
packer.AddStreamFrame(f1)
packer.AddStreamFrame(f2)
p, err := packer.PackPacket([]frames.Frame{}, true)
Expect(p).ToNot(BeNil())
Expect(err).ToNot(HaveOccurred())
It("packs many control frames into 1 packets", func() {
f := &frames.AckFrame{LargestObserved: 1}
b := &bytes.Buffer{}
f1.Write(b, 2, 6)
f2.Write(b, 2, 6)
Expect(len(p.frames)).To(Equal(2))
Expect(p.raw).To(ContainSubstring(string(b.Bytes())))
f.Write(b, 3, 6)
maxFramesPerPacket := protocol.MaxFrameSize / b.Len()
var controlFrames []frames.Frame
for i := 0; i < maxFramesPerPacket; i++ {
controlFrames = append(controlFrames, f)
}
payloadFrames, err := packer.composeNextPacket(controlFrames, true)
Expect(err).ToNot(HaveOccurred())
Expect(len(payloadFrames)).To(Equal(maxFramesPerPacket))
payloadFrames, err = packer.composeNextPacket([]frames.Frame{}, true)
Expect(err).ToNot(HaveOccurred())
Expect(len(payloadFrames)).To(BeZero())
})
//
// It("packs many normal frames into 2 packets", func() {
// f := &frames.AckFrame{LargestObserved: 1}
// b := &bytes.Buffer{}
// f.Write(b, 3, 6)
// maxFramesPerPacket := protocol.MaxFrameSize / b.Len()
// counter := 0
// for i := 0; i < maxFramesPerPacket+1; i++ {
// packer.AddFrame(f)
// counter++
// }
// payloadFrames, err := packer.composeNextPacket([]frames.Frame{}, true)
// Expect(err).ToNot(HaveOccurred())
// Expect(len(payloadFrames)).To(Equal(maxFramesPerPacket))
// payloadFrames, err = packer.composeNextPacket([]frames.Frame{}, true)
// Expect(err).ToNot(HaveOccurred())
// Expect(len(payloadFrames)).To(Equal(counter - maxFramesPerPacket))
// })
It("only increases the packet number when there is an actual packet to send", func() {
f := frames.StreamFrame{
@@ -136,6 +114,27 @@ var _ = Describe("Packet packer", func() {
Expect(len(payloadFrames)).To(Equal(0))
})
It("packs multiple small stream frames into single packet", func() {
f1 := frames.StreamFrame{
StreamID: 5,
Data: []byte{0xDE, 0xCA, 0xFB, 0xAD},
}
f2 := frames.StreamFrame{
StreamID: 5,
Data: []byte{0xBE, 0xEF, 0x13, 0x37},
}
packer.AddStreamFrame(f1)
packer.AddStreamFrame(f2)
p, err := packer.PackPacket([]frames.Frame{}, true)
Expect(p).ToNot(BeNil())
Expect(err).ToNot(HaveOccurred())
b := &bytes.Buffer{}
f1.Write(b, 2, 6)
f2.Write(b, 2, 6)
Expect(len(p.frames)).To(Equal(2))
Expect(p.raw).To(ContainSubstring(string(b.Bytes())))
})
It("splits one stream frame larger than maximum size", func() {
maxStreamFrameDataLen := protocol.MaxFrameSize - (1 + 4 + 8 + 2)
f := frames.StreamFrame{