From 91a8fc94562e3313b2295e116045427624f54726 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Thu, 19 Oct 2017 14:30:24 +0700 Subject: [PATCH] open the crypto stream during session setup --- session.go | 20 +++++++++++--------- session_test.go | 10 +++++----- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/session.go b/session.go index e0998fc53..c3d27de8f 100644 --- a/session.go +++ b/session.go @@ -258,21 +258,24 @@ func (s *session) setup( ) s.unpacker = &packetUnpacker{aead: s.cryptoSetup, version: s.version} + // open the crypto stream + if s.perspective == protocol.PerspectiveServer { + _, _ = s.GetOrOpenStream(1) + _, _ = s.AcceptStream() // don't expose the crypto stream + } else { + _, _ = s.OpenStream() + } + return s, handshakeChan, nil } // run the session main loop func (s *session) run() error { - // Start the crypto stream handler - var cryptoStream Stream - if s.perspective == protocol.PerspectiveServer { - cryptoStream, _ = s.GetOrOpenStream(1) - _, _ = s.AcceptStream() // don't expose the crypto stream - } else { - cryptoStream, _ = s.OpenStream() - } + defer s.ctxCancel() + // Start the crypto stream handler go func() { + cryptoStream, _ := s.GetOrOpenStream(1) if err := s.cryptoSetup.HandleCryptoStream(cryptoStream); err != nil { s.Close(err) } @@ -366,7 +369,6 @@ runLoop: s.handshakeChan <- handshakeEvent{err: closeErr.err} } s.handleCloseError(closeErr) - defer s.ctxCancel() return closeErr.err } diff --git a/session_test.go b/session_test.go index 0e9e1a083..504e38a05 100644 --- a/session_test.go +++ b/session_test.go @@ -208,7 +208,7 @@ var _ = Describe("Session", func() { ) Expect(err).NotTo(HaveOccurred()) sess = pSess.(*session) - Expect(sess.streamsMap.openStreams).To(BeEmpty()) // the crypto stream is opened in session.run() + Expect(sess.streamsMap.openStreams).To(HaveLen(1)) // 1 stream: the crypto stream sess.connParams = &mockParamsNegotiator{} }) @@ -684,15 +684,15 @@ var _ = Describe("Session", func() { }() Consistently(strChan).ShouldNot(Receive()) err := sess.handleStreamFrame(&wire.StreamFrame{ - StreamID: 3, + StreamID: 5, Data: []byte("foobar"), }) Expect(err).ToNot(HaveOccurred()) var str Stream Eventually(strChan).Should(Receive(&str)) - Expect(str.StreamID()).To(Equal(protocol.StreamID(1))) - Eventually(strChan).Should(Receive(&str)) Expect(str.StreamID()).To(Equal(protocol.StreamID(3))) + Eventually(strChan).Should(Receive(&str)) + Expect(str.StreamID()).To(Equal(protocol.StreamID(5))) }) It("stops accepting when the session is closed", func() { @@ -1684,7 +1684,7 @@ var _ = Describe("Client Session", func() { ) sess = sessP.(*session) Expect(err).ToNot(HaveOccurred()) - Expect(sess.streamsMap.openStreams).To(BeEmpty()) // the crypto stream is opened in session.run() + Expect(sess.streamsMap.openStreams).To(HaveLen(1)) }) AfterEach(func() {