From d1c9d8e93d5a05a530e537c9842992ce25a1d453 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 20 Feb 2017 11:52:00 +0700 Subject: [PATCH] only send the client version number until the handshake is complete fixes #426 --- packet_packer.go | 3 +-- packet_packer_test.go | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packet_packer.go b/packet_packer.go index fdf307aa..a44490a2 100644 --- a/packet_packer.go +++ b/packet_packer.go @@ -77,8 +77,7 @@ func (p *packetPacker) packPacket(stopWaitingFrame *frames.StopWaitingFrame, lea responsePublicHeader.DiversificationNonce = p.cryptoSetup.DiversificationNonce() } - // TODO: stop sending version numbers once a version has been negotiated - if p.perspective == protocol.PerspectiveClient { + if p.perspective == protocol.PerspectiveClient && !p.cryptoSetup.HandshakeComplete() { responsePublicHeader.VersionFlag = true responsePublicHeader.VersionNumber = p.version } diff --git a/packet_packer_test.go b/packet_packer_test.go index 4372beee..39bf8708 100644 --- a/packet_packer_test.go +++ b/packet_packer_test.go @@ -167,8 +167,9 @@ var _ = Describe("Packet packer", func() { Expect(p).ToNot(BeNil()) }) - It("adds the version flag to the public header", func() { + It("adds the version flag to the public header before the crypto handshake is finished", func() { packer.perspective = protocol.PerspectiveClient + packer.cryptoSetup.(*mockCryptoSetup).handshakeComplete = false packer.controlFrames = []frames.Frame{&frames.BlockedFrame{StreamID: 0}} packer.connectionID = 0x1337 packer.version = 123 @@ -181,6 +182,19 @@ var _ = Describe("Packet packer", func() { Expect(hdr.VersionNumber).To(Equal(packer.version)) }) + It("doesn't add the version flag to the public header after the crypto handshake is completed", func() { + packer.perspective = protocol.PerspectiveClient + packer.cryptoSetup.(*mockCryptoSetup).handshakeComplete = true + packer.controlFrames = []frames.Frame{&frames.BlockedFrame{StreamID: 0}} + packer.connectionID = 0x1337 + p, err := packer.PackPacket(nil, []frames.Frame{}, 0) + Expect(err).ToNot(HaveOccurred()) + Expect(p).ToNot(BeNil()) + hdr, err := ParsePublicHeader(bytes.NewReader(p.raw), protocol.PerspectiveClient) + Expect(err).ToNot(HaveOccurred()) + Expect(hdr.VersionFlag).To(BeFalse()) + }) + It("packs many control frames into 1 packets", func() { f := &frames.AckFrame{LargestAcked: 1} b := &bytes.Buffer{}