pack WindowUpdate frames into two packets if they don't fit into one

work towards #96
This commit is contained in:
Marten Seemann
2016-05-15 11:41:07 +07:00
parent 13f15c8c23
commit 0d29bdc499
2 changed files with 22 additions and 5 deletions

View File

@@ -132,17 +132,15 @@ func (p *packetPacker) composeNextPacket(stopWaitingFrame *frames.StopWaitingFra
maxFrameSize := protocol.MaxFrameAndPublicHeaderSize - publicHeaderLength
// TODO: handle the extremely unlikely case that there are more windowUpdateFrames than we can fit into one packet
for len(p.windowUpdateFrames) > 0 {
frame := p.windowUpdateFrames[0]
minLength, _ := frame.MinLength() // windowUpdateFrames.MinLength() *never* returns an error
if payloadLength+minLength > maxFrameSize {
break
}
payloadLength += minLength
payloadFrames = append(payloadFrames, frame)
p.windowUpdateFrames = p.windowUpdateFrames[1:]
if payloadLength > maxFrameSize {
panic("internal inconsistency: packet payload too large")
}
}
if stopWaitingFrame != nil {

View File

@@ -217,6 +217,25 @@ var _ = Describe("Packet packer", func() {
Expect(payloadFrames).To(ContainElement(f2))
})
It("packs a lot of window update frames into 2 packets if they don't fit into one", func() {
windowUpdateFrame := &frames.WindowUpdateFrame{
StreamID: 0x1337,
}
minLength, _ := windowUpdateFrame.MinLength()
maxFramesPerPacket := int(protocol.MaxFrameAndPublicHeaderSize-publicHeaderLen) / int(minLength)
var controlFrames []frames.Frame
for i := 0; i < maxFramesPerPacket+10; i++ {
controlFrames = append(controlFrames, windowUpdateFrame)
}
packer.controlFrames = controlFrames
payloadFrames, err := packer.composeNextPacket(nil, publicHeaderLen, true)
Expect(err).ToNot(HaveOccurred())
Expect(len(payloadFrames)).To(Equal(maxFramesPerPacket))
payloadFrames, err = packer.composeNextPacket(nil, publicHeaderLen, true)
Expect(err).ToNot(HaveOccurred())
Expect(len(payloadFrames)).To(Equal(10))
})
It("only packs a WindowUpdateFrame once", func() {
f := &frames.WindowUpdateFrame{
StreamID: 0x1337,