From cc76441539634601297311a62db3b52a6d6ce869 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sat, 27 Jul 2019 01:06:43 -0400 Subject: [PATCH] implement a function that blocks until an early session can be used --- session.go | 10 ++++++++++ session_test.go | 3 +++ 2 files changed, 13 insertions(+) diff --git a/session.go b/session.go index 793b9d8fd..6030c3034 100644 --- a/session.go +++ b/session.go @@ -143,6 +143,7 @@ type session struct { undecryptablePackets []*receivedPacket clientHelloWritten <-chan struct{} + earlySessionReadyChan chan struct{} handshakeCompleteChan chan struct{} // is closed when the handshake completes handshakeComplete bool @@ -345,6 +346,7 @@ func (s *session) preSetup() { s.rttStats, s.logger, ) + s.earlySessionReadyChan = make(chan struct{}) if s.config.QuicTracer != nil { s.traceCallback = func(ev quictrace.Event) { s.config.QuicTracer.Trace(s.origDestConnID, ev) @@ -468,6 +470,11 @@ runLoop: return closeErr.err } +// blocks until the early session can be used +func (s *session) earlySessionReady() <-chan struct{} { + return s.earlySessionReadyChan +} + func (s *session) HandshakeComplete() context.Context { return s.handshakeCtx } @@ -1013,6 +1020,9 @@ func (s *session) processTransportParameters(data []byte) { if params.StatelessResetToken != nil { s.sessionRunner.AddResetToken(*params.StatelessResetToken, s) } + // On the server side, the early session is ready as soon as we processed + // the client's transport parameters. + close(s.earlySessionReadyChan) } func (s *session) processTransportParametersForClient(data []byte) (*handshake.TransportParameters, error) { diff --git a/session_test.go b/session_test.go index 1a92f4292..82e606cc0 100644 --- a/session_test.go +++ b/session_test.go @@ -1286,7 +1286,10 @@ var _ = Describe("Session", func() { } streamManager.EXPECT().UpdateLimits(params) packer.EXPECT().HandleTransportParameters(params) + Expect(sess.earlySessionReady()).ToNot(BeClosed()) sess.processTransportParameters(params.Marshal()) + Expect(sess.earlySessionReady()).To(BeClosed()) + // make the go routine return streamManager.EXPECT().CloseWithError(gomock.Any()) sessionRunner.EXPECT().Retire(gomock.Any())