gfe-relnote: When new 0RTT key is available, only allow client to write application data as server application data should be written in forward secure. Protected by gfe2_reloadable_flag_quic_use_handshaker_delegate2 which replaces gfe2_reloadable_flag_quic_use_handshaker_delegate. PiperOrigin-RevId: 284213052 Change-Id: Ic77723e7f8570fb720af719af98d86e47c76ad34
diff --git a/quic/core/http/quic_spdy_stream_test.cc b/quic/core/http/quic_spdy_stream_test.cc index 62ef3b5..bc85384 100644 --- a/quic/core/http/quic_spdy_stream_test.cc +++ b/quic/core/http/quic_spdy_stream_test.cc
@@ -223,7 +223,10 @@ QuicConfigPeer::SetReceivedMaxIncomingUnidirectionalStreams( session_->config(), 10); session_->OnConfigNegotiated(); - EXPECT_CALL(*connection_, OnCanWrite()); + if (!session_->use_handshake_delegate() || + session_->perspective() == Perspective::IS_CLIENT) { + EXPECT_CALL(*connection_, OnCanWrite()); + } if (UsesHttp3()) { // In this case, TestStream::WriteHeadersImpl() does not prevent writes. // Six writes include priority for headers, headers frame header, headers
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc index 9349bf2..55f53eb 100644 --- a/quic/core/quic_connection.cc +++ b/quic/core/quic_connection.cc
@@ -333,7 +333,7 @@ quic_version_negotiated_by_default_at_server_( GetQuicReloadableFlag(quic_version_negotiated_by_default_at_server)), use_handshake_delegate_( - GetQuicReloadableFlag(quic_use_handshaker_delegate) || + GetQuicReloadableFlag(quic_use_handshaker_delegate2) || version().handshake_protocol == PROTOCOL_TLS1_3) { QUIC_DLOG(INFO) << ENDPOINT << "Created connection with server connection ID " << server_connection_id @@ -345,7 +345,7 @@ << server_connection_id << " which is invalid with version " << QuicVersionToString(transport_version()); if (use_handshake_delegate_) { - QUIC_RELOADABLE_FLAG_COUNT(quic_use_handshaker_delegate); + QUIC_RELOADABLE_FLAG_COUNT(quic_use_handshaker_delegate2); } framer_.set_visitor(this);
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h index abd836f..ca4e9ca 100644 --- a/quic/core/quic_connection.h +++ b/quic/core/quic_connection.h
@@ -1505,7 +1505,7 @@ // Latched value of quic_version_negotiated_by_default_at_server. const bool quic_version_negotiated_by_default_at_server_; - // Latched value of quic_use_handshaker_delegate. + // Latched value of quic_use_handshaker_delegate2. const bool use_handshake_delegate_; };
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc index ada8bf4..6381bf2 100644 --- a/quic/core/quic_session.cc +++ b/quic/core/quic_session.cc
@@ -1326,11 +1326,13 @@ case ENCRYPTION_INITIAL: break; case ENCRYPTION_ZERO_RTT: - // Retransmit old 0-RTT data (if any) with the new 0-RTT keys, since they - // can't be decrypted by the peer. - connection_->RetransmitUnackedPackets(ALL_INITIAL_RETRANSMISSION); - // Given any streams blocked by encryption a chance to write. - OnCanWrite(); + if (perspective() == Perspective::IS_CLIENT) { + // Retransmit old 0-RTT data (if any) with the new 0-RTT keys, since + // they can't be decrypted by the server. + connection_->RetransmitUnackedPackets(ALL_INITIAL_RETRANSMISSION); + // Given any streams blocked by encryption a chance to write. + OnCanWrite(); + } break; case ENCRYPTION_HANDSHAKE: break;