gfe-relnote: Create handshaker for QuicCryptoServerStream in constructor instead of later. Protected by reloadable flag quic_set_server_handshaker_in_constructor. PiperOrigin-RevId: 286659143 Change-Id: I2b95c42420ebb27bfc14fe003b69dad423a60451
diff --git a/quic/core/quic_crypto_server_stream.cc b/quic/core/quic_crypto_server_stream.cc index f0f0f64..784b20a 100644 --- a/quic/core/quic_crypto_server_stream.cc +++ b/quic/core/quic_crypto_server_stream.cc
@@ -32,11 +32,42 @@ QuicCompressedCertsCache* compressed_certs_cache, QuicSession* session, Helper* helper) + : QuicCryptoServerStream(crypto_config, + compressed_certs_cache, + session, + helper, + /*handshaker*/ nullptr) {} + +QuicCryptoServerStream::QuicCryptoServerStream( + const QuicCryptoServerConfig* crypto_config, + QuicCompressedCertsCache* compressed_certs_cache, + QuicSession* session, + Helper* helper, + std::unique_ptr<HandshakerDelegate> handshaker) : QuicCryptoServerStreamBase(session), + handshaker_(std::move(handshaker)), + create_handshaker_in_constructor_( + GetQuicReloadableFlag(quic_create_server_handshaker_in_constructor)), crypto_config_(crypto_config), compressed_certs_cache_(compressed_certs_cache), helper_(helper) { DCHECK_EQ(Perspective::IS_SERVER, session->connection()->perspective()); + if (create_handshaker_in_constructor_ && !handshaker_) { + switch (session->connection()->version().handshake_protocol) { + case PROTOCOL_QUIC_CRYPTO: + handshaker_ = std::make_unique<QuicCryptoServerHandshaker>( + crypto_config_, this, compressed_certs_cache_, session, helper_); + break; + case PROTOCOL_TLS1_3: + handshaker_ = std::make_unique<TlsServerHandshaker>( + this, session, crypto_config_->ssl_ctx(), + crypto_config_->proof_source()); + break; + case PROTOCOL_UNSUPPORTED: + QUIC_BUG << "Attempting to create QuicCryptoServerStream for unknown " + "handshake protocol"; + } + } } QuicCryptoServerStream::~QuicCryptoServerStream() {} @@ -122,6 +153,9 @@ void QuicCryptoServerStream::OnSuccessfulVersionNegotiation( const ParsedQuicVersion& version) { DCHECK_EQ(version, session()->connection()->version()); + if (create_handshaker_in_constructor_) { + return; + } CHECK(!handshaker_); switch (session()->connection()->version().handshake_protocol) { case PROTOCOL_QUIC_CRYPTO:
diff --git a/quic/core/quic_crypto_server_stream.h b/quic/core/quic_crypto_server_stream.h index 2e0e723..427cced 100644 --- a/quic/core/quic_crypto_server_stream.h +++ b/quic/core/quic_crypto_server_stream.h
@@ -188,6 +188,11 @@ // handshaker hasn't been set yet. If set_handshaker is called outside of // OnSuccessfulVersionNegotiation, then that method must be overridden to not // set a handshaker. + QuicCryptoServerStream(const QuicCryptoServerConfig* crypto_config, + QuicCompressedCertsCache* compressed_certs_cache, + QuicSession* session, + Helper* helper, + std::unique_ptr<HandshakerDelegate> handshaker); void set_handshaker(std::unique_ptr<HandshakerDelegate> handshaker); HandshakerDelegate* handshaker() const; @@ -197,6 +202,8 @@ private: std::unique_ptr<HandshakerDelegate> handshaker_; + // Latched value of quic_create_server_handshaker_in_constructor flag. + bool create_handshaker_in_constructor_; // Arguments from QuicCryptoServerStream constructor that might need to be // passed to the HandshakerDelegate constructor in its late construction.