From 3f6b228d075e3e2f2bdc71f73b5dece26678692c Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 27 Apr 2016 10:09:54 +0700 Subject: [PATCH] fix splitting of StreamFrames in PacketPacker --- packet_packer.go | 6 +++--- packet_packer_test.go | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/packet_packer.go b/packet_packer.go index 1618f56c2..b132377fc 100644 --- a/packet_packer.go +++ b/packet_packer.go @@ -116,7 +116,7 @@ func (p *packetPacker) composeNextPacket(controlFrames []frames.Frame, includeSt } for len(p.queuedStreamFrames) > 0 { - frame := p.queuedStreamFrames[0] + frame := &p.queuedStreamFrames[0] if payloadLength > protocol.MaxFrameSize { panic("internal inconsistency: packet payload too large") @@ -131,7 +131,7 @@ func (p *packetPacker) composeNextPacket(controlFrames []frames.Frame, includeSt previousFrame := frame.MaybeSplitOffFrame(protocol.MaxFrameSize - payloadLength) if previousFrame != nil { // Don't pop the queue, leave the modified frame in - frame = *previousFrame + frame = previousFrame payloadLength += len(previousFrame.Data) - 1 } else { p.queuedStreamFrames = p.queuedStreamFrames[1:] @@ -139,7 +139,7 @@ func (p *packetPacker) composeNextPacket(controlFrames []frames.Frame, includeSt } payloadLength += frame.MinLength() - payloadFrames = append(payloadFrames, &frame) + payloadFrames = append(payloadFrames, frame) } return payloadFrames, nil diff --git a/packet_packer_test.go b/packet_packer_test.go index 94a0a31e0..4b2989636 100644 --- a/packet_packer_test.go +++ b/packet_packer_test.go @@ -136,6 +136,26 @@ var _ = Describe("Packet packer", func() { Expect(len(payloadFrames)).To(Equal(0)) }) + It("splits one stream frame larger than maximum size", func() { + maxStreamFrameDataLen := protocol.MaxFrameSize - (1 + 4 + 8 + 2) + f := frames.StreamFrame{ + Data: bytes.Repeat([]byte{'f'}, maxStreamFrameDataLen+200), + Offset: 1, + } + packer.AddStreamFrame(f) + payloadFrames, err := packer.composeNextPacket([]frames.Frame{}, true) + Expect(err).ToNot(HaveOccurred()) + Expect(len(payloadFrames)).To(Equal(1)) + Expect(len(payloadFrames[0].(*frames.StreamFrame).Data)).To(Equal(maxStreamFrameDataLen)) + payloadFrames, err = packer.composeNextPacket([]frames.Frame{}, true) + Expect(err).ToNot(HaveOccurred()) + Expect(len(payloadFrames)).To(Equal(1)) + Expect(len(payloadFrames[0].(*frames.StreamFrame).Data)).To(Equal(200)) + payloadFrames, err = packer.composeNextPacket([]frames.Frame{}, true) + Expect(err).ToNot(HaveOccurred()) + Expect(len(payloadFrames)).To(Equal(0)) + }) + It("packs 2 stream frames that are too big for one packet correctly", func() { maxStreamFrameDataLen := protocol.MaxFrameSize - (1 + 4 + 8 + 2) f1 := frames.StreamFrame{ @@ -157,6 +177,9 @@ var _ = Describe("Packet packer", func() { p, err = packer.PackPacket([]frames.Frame{}, true) Expect(err).ToNot(HaveOccurred()) Expect(p).ToNot(BeNil()) + p, err = packer.PackPacket([]frames.Frame{}, true) + Expect(err).ToNot(HaveOccurred()) + Expect(p).To(BeNil()) }) It("packs a packet that has the maximum packet size when given a large enough stream frame", func() {