From 0d29bdc499ba1647d7c1d9ae4df3e558fcd7acda Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sun, 15 May 2016 11:41:07 +0700 Subject: [PATCH] pack WindowUpdate frames into two packets if they don't fit into one work towards #96 --- packet_packer.go | 8 +++----- packet_packer_test.go | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/packet_packer.go b/packet_packer.go index 129f24a12..85b310b07 100644 --- a/packet_packer.go +++ b/packet_packer.go @@ -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 { diff --git a/packet_packer_test.go b/packet_packer_test.go index f12e3c2d6..ab8de2b45 100644 --- a/packet_packer_test.go +++ b/packet_packer_test.go @@ -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,