From 08ec2f69fc09405edb6edaff237dbc5ae3a90683 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Fri, 22 Nov 2019 10:43:24 +0800 Subject: [PATCH] send a HANDSHAKE_DONE frame after handshake completion (as a server) --- session.go | 7 +++---- session_test.go | 5 ++++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/session.go b/session.go index 68d7407bb..a3efa271a 100644 --- a/session.go +++ b/session.go @@ -603,16 +603,14 @@ func (s *session) handleHandshakeComplete() { s.connIDGenerator.SetHandshakeComplete() s.sentPacketHandler.SetHandshakeComplete() - // The client completes the handshake first (after sending the CFIN). - // We need to make sure it learns about the server completing the handshake, - // in order to stop retransmitting handshake packets. - // They will stop retransmitting handshake packets when receiving the first 1-RTT packet. + if s.perspective == protocol.PerspectiveServer { token, err := s.tokenGenerator.NewToken(s.conn.RemoteAddr()) if err != nil { s.closeLocal(err) } s.queueControlFrame(&wire.NewTokenFrame{Token: token}) + s.queueControlFrame(&wire.HandshakeDoneFrame{}) } } @@ -855,6 +853,7 @@ func (s *session) handleFrame(f wire.Frame, pn protocol.PacketNumber, encLevel p err = s.handleNewConnectionIDFrame(frame) case *wire.RetireConnectionIDFrame: err = s.handleRetireConnectionIDFrame(frame) + case *wire.HandshakeDoneFrame: default: err = fmt.Errorf("unexpected frame type: %s", reflect.ValueOf(&frame).Elem().Type().Name()) } diff --git a/session_test.go b/session_test.go index b277b7326..ede060931 100644 --- a/session_test.go +++ b/session_test.go @@ -1239,10 +1239,13 @@ var _ = Describe("Session", func() { Eventually(sess.Context().Done()).Should(BeClosed()) }) - It("sends a 1-RTT packet when the handshake completes", func() { + It("sends a HANDSHAKE_DONE frame when the handshake completes", func() { done := make(chan struct{}) sessionRunner.EXPECT().Retire(clientDestConnID) packer.EXPECT().PackPacket().DoAndReturn(func() (*packedPacket, error) { + frames, _ := sess.framer.AppendControlFrames(nil, protocol.MaxByteCount) + Expect(frames).ToNot(BeEmpty()) + Expect(frames[0].Frame).To(BeEquivalentTo(&wire.HandshakeDoneFrame{})) defer close(done) return &packedPacket{ header: &wire.ExtendedHeader{},