Deprecate --gfe2_reloadable_flag_quic_ignore_max_push_id. Remove Http3DebugVisitor::OnMaxPushIdFrameReceived(). This method was never implemented server side, and is useless client side, because servers are not allowed to send MAX_PUSH_ID frames. In Chromium, QuicHttp3Logger::OnMaxPushIdFrameReceived() and NetLogEventType::HTTP3_MAX_PUSH_ID_RECEIVED should be removed. Remove QuicSpdySession::OnMaxPushIdFrame() and max_push_id_. PiperOrigin-RevId: 442564242
diff --git a/quiche/quic/core/http/quic_receive_control_stream.cc b/quiche/quic/core/http/quic_receive_control_stream.cc index 853909a..1eba8f5 100644 --- a/quiche/quic/core/http/quic_receive_control_stream.cc +++ b/quiche/quic/core/http/quic_receive_control_stream.cc
@@ -62,21 +62,9 @@ stream_delegate()->OnStreamError(decoder->error(), decoder->error_detail()); } -bool QuicReceiveControlStream::OnMaxPushIdFrame(const MaxPushIdFrame& frame) { - if (GetQuicReloadableFlag(quic_ignore_max_push_id)) { - QUIC_RELOADABLE_FLAG_COUNT(quic_ignore_max_push_id); - return ValidateFrameType(HttpFrameType::MAX_PUSH_ID); - } - - if (spdy_session()->debug_visitor()) { - spdy_session()->debug_visitor()->OnMaxPushIdFrameReceived(frame); - } - - if (!ValidateFrameType(HttpFrameType::MAX_PUSH_ID)) { - return false; - } - - return spdy_session()->OnMaxPushIdFrame(frame.push_id); +bool QuicReceiveControlStream::OnMaxPushIdFrame( + const MaxPushIdFrame& /*frame*/) { + return ValidateFrameType(HttpFrameType::MAX_PUSH_ID); } bool QuicReceiveControlStream::OnGoAwayFrame(const GoAwayFrame& frame) {
diff --git a/quiche/quic/core/http/quic_spdy_session.cc b/quiche/quic/core/http/quic_spdy_session.cc index 48baa74..58ce9ac 100644 --- a/quiche/quic/core/http/quic_spdy_session.cc +++ b/quiche/quic/core/http/quic_spdy_session.cc
@@ -1558,38 +1558,6 @@ } } -bool QuicSpdySession::OnMaxPushIdFrame(PushId max_push_id) { - QUICHE_DCHECK(VersionUsesHttp3(transport_version())); - QUICHE_DCHECK_EQ(Perspective::IS_SERVER, perspective()); - - if (max_push_id_.has_value()) { - QUIC_DVLOG(1) << "Setting max_push_id to: " << max_push_id - << " from: " << max_push_id_.value(); - } else { - QUIC_DVLOG(1) << "Setting max_push_id to: " << max_push_id - << " from unset"; - } - absl::optional<PushId> old_max_push_id = max_push_id_; - max_push_id_ = max_push_id; - - if (!old_max_push_id.has_value() || max_push_id > old_max_push_id.value()) { - OnCanCreateNewOutgoingStream(true); - return true; - } - - // Equal value is not considered an error. - if (max_push_id < old_max_push_id.value()) { - CloseConnectionWithDetails( - QUIC_HTTP_INVALID_MAX_PUSH_ID, - absl::StrCat("MAX_PUSH_ID received with value ", max_push_id, - " which is smaller that previously received value ", - old_max_push_id.value())); - return false; - } - - return true; -} - bool QuicSpdySession::goaway_received() const { return VersionUsesHttp3(transport_version()) ? last_received_http3_goaway_id_.has_value()
diff --git a/quiche/quic/core/http/quic_spdy_session.h b/quiche/quic/core/http/quic_spdy_session.h index b31b5ad..8d737d6 100644 --- a/quiche/quic/core/http/quic_spdy_session.h +++ b/quiche/quic/core/http/quic_spdy_session.h
@@ -81,8 +81,6 @@ // Incoming HTTP/3 frames on the control stream. virtual void OnSettingsFrameReceived(const SettingsFrame& /*frame*/) = 0; virtual void OnGoAwayFrameReceived(const GoAwayFrame& /*frame*/) {} - // TODO(b/171463363): Remove. - virtual void OnMaxPushIdFrameReceived(const MaxPushIdFrame& /*frame*/) {} virtual void OnPriorityUpdateFrameReceived( const PriorityUpdateFrame& /*frame*/) {} virtual void OnAcceptChFrameReceived(const AcceptChFrame& /*frame*/) {} @@ -322,14 +320,6 @@ // those streams are not initialized yet. void OnCanCreateNewOutgoingStream(bool unidirectional) override; - // Sets |max_push_id_|. - // This method must only be called if protocol is IETF QUIC and perspective is - // server. It must only be called if a MAX_PUSH_ID frame is received. - // Returns whether |max_push_id| is greater than or equal to current - // |max_push_id_|. - // TODO(b/171463363): Remove. - bool OnMaxPushIdFrame(PushId max_push_id); - int32_t destruction_indicator() const { return destruction_indicator_; } void set_debug_visitor(Http3DebugVisitor* debug_visitor) { @@ -567,10 +557,9 @@ absl::string_view type); // Sends any data which should be sent at the start of a connection, including - // the initial SETTINGS frame, and (when IETF QUIC is used) also a MAX_PUSH_ID - // frame if SetMaxPushId() had been called before encryption was established. - // When using 0-RTT, this method is called twice: once when encryption is - // established, and again when 1-RTT keys are available. + // 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(); @@ -631,20 +620,6 @@ http2::Http2DecoderAdapter h2_deframer_; std::unique_ptr<SpdyFramerVisitor> spdy_framer_visitor_; - // Used in IETF QUIC only. - // For a server: - // the push ID in the most recently received MAX_PUSH_ID frame, - // or unset if no MAX_PUSH_ID frame has been received. - // For a client: - // unset until SetMaxPushId() is called; - // before encryption is established, the push ID to be sent in the initial - // MAX_PUSH_ID frame; - // after encryption is established, the push ID in the most recently sent - // MAX_PUSH_ID frame. - // Once set, never goes back to unset. - // TODO(b/171463363): Remove. - absl::optional<PushId> max_push_id_; - // Not owned by the session. Http3DebugVisitor* debug_visitor_;
diff --git a/quiche/quic/core/http/quic_spdy_session_test.cc b/quiche/quic/core/http/quic_spdy_session_test.cc index e26432a..8636a75 100644 --- a/quiche/quic/core/http/quic_spdy_session_test.cc +++ b/quiche/quic/core/http/quic_spdy_session_test.cc
@@ -502,29 +502,6 @@ return std::string(priority_buffer.get(), priority_frame_length); } - // TODO(b/171463363): Remove. - std::string SerializeMaxPushIdFrame(PushId push_id) { - const QuicByteCount payload_length = - QuicDataWriter::GetVarInt62Len(push_id); - - const QuicByteCount total_length = - QuicDataWriter::GetVarInt62Len( - static_cast<uint64_t>(HttpFrameType::MAX_PUSH_ID)) + - QuicDataWriter::GetVarInt62Len(payload_length) + - QuicDataWriter::GetVarInt62Len(push_id); - - std::string max_push_id_frame(total_length, '\0'); - QuicDataWriter writer(total_length, &*max_push_id_frame.begin()); - - QUICHE_CHECK(writer.WriteVarInt62( - static_cast<uint64_t>(HttpFrameType::MAX_PUSH_ID))); - QUICHE_CHECK(writer.WriteVarInt62(payload_length)); - QUICHE_CHECK(writer.WriteVarInt62(push_id)); - QUICHE_CHECK_EQ(0u, writer.remaining()); - - return max_push_id_frame; - } - QuicStreamId StreamCountToId(QuicStreamCount stream_count, Perspective perspective, bool bidirectional) { // Calculate and build up stream ID rather than use @@ -1815,60 +1792,6 @@ } } -// TODO(b/171463363): Remove. -TEST_P(QuicSpdySessionTestServer, ReduceMaxPushId) { - if (GetQuicReloadableFlag(quic_ignore_max_push_id)) { - return; - } - - if (!VersionUsesHttp3(transport_version())) { - return; - } - - StrictMock<MockHttp3DebugVisitor> debug_visitor; - session_.set_debug_visitor(&debug_visitor); - - // Use an arbitrary stream id for incoming control stream. - QuicStreamId stream_id = - GetNthClientInitiatedUnidirectionalStreamId(transport_version(), 3); - char type[] = {kControlStream}; - absl::string_view stream_type(type, 1); - - QuicStreamOffset offset = 0; - QuicStreamFrame data1(stream_id, false, offset, stream_type); - offset += stream_type.length(); - EXPECT_CALL(debug_visitor, OnPeerControlStreamCreated(stream_id)); - session_.OnStreamFrame(data1); - EXPECT_EQ(stream_id, - QuicSpdySessionPeer::GetReceiveControlStream(&session_)->id()); - - SettingsFrame settings; - std::string settings_frame = EncodeSettings(settings); - QuicStreamFrame data2(stream_id, false, offset, settings_frame); - offset += settings_frame.length(); - - EXPECT_CALL(debug_visitor, OnSettingsFrameReceived(settings)); - session_.OnStreamFrame(data2); - - std::string max_push_id_frame1 = SerializeMaxPushIdFrame(/* push_id = */ 3); - QuicStreamFrame data3(stream_id, false, offset, max_push_id_frame1); - offset += max_push_id_frame1.length(); - - EXPECT_CALL(debug_visitor, OnMaxPushIdFrameReceived(_)); - session_.OnStreamFrame(data3); - - std::string max_push_id_frame2 = SerializeMaxPushIdFrame(/* push_id = */ 1); - QuicStreamFrame data4(stream_id, false, offset, max_push_id_frame2); - - EXPECT_CALL(debug_visitor, OnMaxPushIdFrameReceived(_)); - EXPECT_CALL(*connection_, - CloseConnection(QUIC_HTTP_INVALID_MAX_PUSH_ID, - "MAX_PUSH_ID received with value 1 which is " - "smaller that previously received value 3", - _)); - session_.OnStreamFrame(data4); -} - class QuicSpdySessionTestClient : public QuicSpdySessionTestBase { protected: QuicSpdySessionTestClient()
diff --git a/quiche/quic/core/quic_flags_list.h b/quiche/quic/core/quic_flags_list.h index 12cac82..2ab566c 100644 --- a/quiche/quic/core/quic_flags_list.h +++ b/quiche/quic/core/quic_flags_list.h
@@ -67,8 +67,6 @@ QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_flush_pending_frames_and_padding_bytes_on_migration, true) // If true, ietf connection migration is no longer conditioned on connection option RVCM. QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_remove_connection_migration_connection_option_v2, false) -// If true, ignore incoming MAX_PUSH_ID frames (expect for enforcing frame type rules). -QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_ignore_max_push_id, true) // If true, include stream information in idle timeout connection close detail. QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_add_stream_info_to_idle_close_detail, true) // If true, limit the size of HPACK encoder dynamic table to 16 kB. Only affects gQUIC; QPACK encoder dynamic table size used in IETF QUIC is already bounded.
diff --git a/quiche/quic/test_tools/quic_test_utils.h b/quiche/quic/test_tools/quic_test_utils.h index aadf96f..84aebc1 100644 --- a/quiche/quic/test_tools/quic_test_utils.h +++ b/quiche/quic/test_tools/quic_test_utils.h
@@ -959,8 +959,6 @@ MOCK_METHOD(void, OnSettingsFrameReceived, (const SettingsFrame&), (override)); MOCK_METHOD(void, OnGoAwayFrameReceived, (const GoAwayFrame&), (override)); - MOCK_METHOD(void, OnMaxPushIdFrameReceived, (const MaxPushIdFrame&), - (override)); MOCK_METHOD(void, OnPriorityUpdateFrameReceived, (const PriorityUpdateFrame&), (override)); MOCK_METHOD(void, OnAcceptChFrameReceived, (const AcceptChFrame&),