forked from quic-go/quic-go
pack WindowUpdate frames into two packets if they don't fit into one
work towards #96
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user