Internal change PiperOrigin-RevId: 451147075
diff --git a/quiche/quic/core/http/quic_spdy_session.h b/quiche/quic/core/http/quic_spdy_session.h index 25d3be0..f117328 100644 --- a/quiche/quic/core/http/quic_spdy_session.h +++ b/quiche/quic/core/http/quic_spdy_session.h
@@ -515,6 +515,12 @@ // in settings and accept remote settings for. virtual HttpDatagramSupport LocalHttpDatagramSupport(); + // Sends any data which should be sent at the start of a connection, including + // the initial SETTINGS frame. When using 0-RTT, this method is called twice: + // once when encryption is established, and again when 1-RTT keys are + // available. + void SendInitialData(); + private: friend class test::QuicSpdySessionPeer; @@ -549,12 +555,6 @@ void CloseConnectionOnDuplicateHttp3UnidirectionalStreams( absl::string_view type); - // Sends any data which should be sent at the start of a connection, including - // the initial SETTINGS frame. When using 0-RTT, this method is called twice: - // once when encryption is established, and again when 1-RTT keys are - // available. - void SendInitialData(); - void FillSettingsFrame(); bool VerifySettingIsZeroOrOne(uint64_t id, uint64_t value);
diff --git a/quiche/quic/test_tools/crypto_test_utils.cc b/quiche/quic/test_tools/crypto_test_utils.cc index 3a1ef63..4df4f8f 100644 --- a/quiche/quic/test_tools/crypto_test_utils.cc +++ b/quiche/quic/test_tools/crypto_test_utils.cc
@@ -384,7 +384,7 @@ << client_conn->encrypted_packets_.size() - client_i << " packets client->server"; MovePackets(client_conn, &client_i, server, server_conn, - Perspective::IS_SERVER); + Perspective::IS_SERVER, /*process_stream_data=*/false); if (client->one_rtt_keys_available() && server->one_rtt_keys_available() && server_conn->encrypted_packets_.size() == server_i) { @@ -395,7 +395,7 @@ << server_conn->encrypted_packets_.size() - server_i << " packets server->client"; MovePackets(server_conn, &server_i, client, client_conn, - Perspective::IS_CLIENT); + Perspective::IS_CLIENT, /*process_stream_data=*/false); } } @@ -404,7 +404,8 @@ std::function<bool()> client_condition, PacketSavingConnection* server_conn, QuicCryptoStream* server, - std::function<bool()> server_condition) { + std::function<bool()> server_condition, + bool process_stream_data) { size_t client_next_packet_to_deliver = client_conn->number_of_packets_delivered_; size_t server_next_packet_to_deliver = @@ -421,7 +422,7 @@ client_next_packet_to_deliver << " packets client->server"; MovePackets(client_conn, &client_next_packet_to_deliver, server, - server_conn, Perspective::IS_SERVER); + server_conn, Perspective::IS_SERVER, process_stream_data); } if (!client_condition()) { QUIC_LOG(INFO) << "Processing " @@ -429,7 +430,7 @@ server_next_packet_to_deliver << " packets server->client"; MovePackets(server_conn, &server_next_packet_to_deliver, client, - client_conn, Perspective::IS_CLIENT); + client_conn, Perspective::IS_CLIENT, process_stream_data); } } client_conn->number_of_packets_delivered_ = client_next_packet_to_deliver; @@ -457,7 +458,7 @@ << client_conn->encrypted_packets_.size() - client_i << " packets client->server"; MovePackets(client_conn, &client_i, server, server_conn, - Perspective::IS_SERVER); + Perspective::IS_SERVER, /*process_stream_data=*/false); } if (server_conn->encrypted_packets_.size() != server_i) { @@ -465,7 +466,7 @@ << server_conn->encrypted_packets_.size() - server_i << " packets server->client"; MovePackets(server_conn, &server_i, client, client_conn, - Perspective::IS_CLIENT); + Perspective::IS_CLIENT, /*process_stream_data=*/false); } return std::make_pair(client_i, server_i); @@ -709,7 +710,7 @@ void MovePackets(PacketSavingConnection* source_conn, size_t* inout_packet_index, QuicCryptoStream* dest_stream, PacketSavingConnection* dest_conn, - Perspective dest_perspective) { + Perspective dest_perspective, bool process_stream_data) { SimpleQuicFramer framer(source_conn->supported_versions(), dest_perspective); QuicFramerPeer::SetLastSerializedServerConnectionId(framer.framer(), TestConnectionId()); @@ -779,10 +780,17 @@ QuicConnectionPeer::SetCurrentPacket( dest_conn, source_conn->encrypted_packets_[index]->AsStringPiece()); for (const auto& stream_frame : framer.stream_frames()) { - // Ignore stream frames that are sent on other streams in the crypto - // event. - if (stream_frame->stream_id == dest_stream->id()) { - dest_stream->OnStreamFrame(*stream_frame); + if (process_stream_data && + dest_stream->handshake_protocol() == PROTOCOL_TLS1_3) { + // Deliver STREAM_FRAME such that application state is available and can + // be stored along with resumption ticket in session cache, + dest_conn->OnStreamFrame(*stream_frame); + } else { + // Ignore stream frames that are sent on other streams in the crypto + // event. + if (stream_frame->stream_id == dest_stream->id()) { + dest_stream->OnStreamFrame(*stream_frame); + } } } for (const auto& crypto_frame : framer.crypto_frames()) {
diff --git a/quiche/quic/test_tools/crypto_test_utils.h b/quiche/quic/test_tools/crypto_test_utils.h index 1f8a255..d21e897 100644 --- a/quiche/quic/test_tools/crypto_test_utils.h +++ b/quiche/quic/test_tools/crypto_test_utils.h
@@ -109,15 +109,18 @@ // CommunicateHandshakeMessagesUntil: // 1) Moves messages from |client| to |server| until |server_condition| is met. // 2) Moves messages from |server| to |client| until |client_condition| is met. -// 3) Returns true if both conditions are met. -// 4) Returns false if either connection is closed or there is no more packet to +// 3) For IETF QUIC, if `process_stream_data` is true, STREAM_FRAME within the +// packet containing crypto messages is also processed. +// 4) Returns true if both conditions are met. +// 5) Returns false if either connection is closed or there is no more packet to // deliver before both conditions are met. bool CommunicateHandshakeMessagesUntil(PacketSavingConnection* client_conn, QuicCryptoStream* client, std::function<bool()> client_condition, PacketSavingConnection* server_conn, QuicCryptoStream* server, - std::function<bool()> server_condition); + std::function<bool()> server_condition, + bool process_stream_data); // AdvanceHandshake attempts to moves messages from |client| to |server| and // |server| to |client|. Returns the number of messages moved. @@ -176,11 +179,13 @@ // MovePackets parses crypto handshake messages from packet number // |*inout_packet_index| through to the last packet (or until a packet fails // to decrypt) and has |dest_stream| process them. |*inout_packet_index| is -// updated with an index one greater than the last packet processed. +// updated with an index one greater than the last packet processed. For IETF +// QUIC, if `process_stream_data` is true, STREAM_FRAME within the packet +// containing crypto messages is also processed. void MovePackets(PacketSavingConnection* source_conn, size_t* inout_packet_index, QuicCryptoStream* dest_stream, PacketSavingConnection* dest_conn, - Perspective dest_perspective); + Perspective dest_perspective, bool process_stream_data); // Return an inchoate CHLO with some basic tag value pairs. CryptoHandshakeMessage GenerateDefaultInchoateCHLO(