From dc3126ba90e33e2992450b34e32602dfe23946e4 Mon Sep 17 00:00:00 2001 From: Lucas Clemente Date: Mon, 19 Jun 2017 18:25:47 +0200 Subject: [PATCH] Move packet writing and sealing to a new function --- packet_packer.go | 62 ++++++++++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 26 deletions(-) diff --git a/packet_packer.go b/packet_packer.go index 3728ad9b..51404009 100644 --- a/packet_packer.go +++ b/packet_packer.go @@ -153,35 +153,11 @@ func (p *packetPacker) packPacket(leastUnacked protocol.PacketNumber, handshakeP p.stopWaiting = nil - raw := getPacketBuffer() - buffer := bytes.NewBuffer(raw) - - if err = publicHeader.Write(buffer, p.version, p.perspective); err != nil { + raw, err := p.writeAndSealPacket(publicHeader, payloadFrames, sealer) + if err != nil { return nil, err } - payloadStartIndex := buffer.Len() - - for _, frame := range payloadFrames { - err = frame.Write(buffer, p.version) - if err != nil { - return nil, err - } - } - - if protocol.ByteCount(buffer.Len()+12) > protocol.MaxPacketSize { - return nil, errors.New("PacketPacker BUG: packet too large") - } - - raw = raw[0:buffer.Len()] - _ = sealer(raw[payloadStartIndex:payloadStartIndex], raw[payloadStartIndex:], publicHeader.PacketNumber, raw[:payloadStartIndex]) - raw = raw[0 : buffer.Len()+12] - - num := p.packetNumberGenerator.Pop() - if num != publicHeader.PacketNumber { - return nil, errors.New("packetPacker BUG: Peeked and Popped packet numbers do not match") - } - return &packedPacket{ number: publicHeader.PacketNumber, raw: raw, @@ -273,6 +249,40 @@ func (p *packetPacker) getPublicHeader(leastUnacked protocol.PacketNumber, encLe return publicHeader } +func (p *packetPacker) writeAndSealPacket( + publicHeader *PublicHeader, + payloadFrames []frames.Frame, + sealer handshake.Sealer, +) ([]byte, error) { + raw := getPacketBuffer() + buffer := bytes.NewBuffer(raw) + + if err := publicHeader.Write(buffer, p.version, p.perspective); err != nil { + return nil, err + } + payloadStartIndex := buffer.Len() + for _, frame := range payloadFrames { + err := frame.Write(buffer, p.version) + if err != nil { + return nil, err + } + } + if protocol.ByteCount(buffer.Len()+12) > protocol.MaxPacketSize { + return nil, errors.New("PacketPacker BUG: packet too large") + } + + raw = raw[0:buffer.Len()] + _ = sealer(raw[payloadStartIndex:payloadStartIndex], raw[payloadStartIndex:], publicHeader.PacketNumber, raw[:payloadStartIndex]) + raw = raw[0 : buffer.Len()+12] + + num := p.packetNumberGenerator.Pop() + if num != publicHeader.PacketNumber { + return nil, errors.New("packetPacker BUG: Peeked and Popped packet numbers do not match") + } + + return raw, nil +} + func (p *packetPacker) canSendData(encLevel protocol.EncryptionLevel) bool { if p.perspective == protocol.PerspectiveClient { return encLevel >= protocol.EncryptionSecure