Unifies `OgHttp2Session::DataFrameInfo` and `Http2VisitorInterface::DataFrameHeaderInfo`. These types are basically the same, so we only need one of them. Protected by refactoring, not protected. PiperOrigin-RevId: 634063835
diff --git a/quiche/http2/adapter/oghttp2_session.cc b/quiche/http2/adapter/oghttp2_session.cc index cbc13d3..82b9d2a 100644 --- a/quiche/http2/adapter/oghttp2_session.cc +++ b/quiche/http2/adapter/oghttp2_session.cc
@@ -873,9 +873,11 @@ static_cast<int32_t>(max_frame_payload_)}); while (connection_can_write == SendResult::SEND_OK && available_window > 0 && IsReadyToWriteData(state)) { - DataFrameInfo info = GetDataFrameInfo(stream_id, available_window, state); + DataFrameHeaderInfo info = + GetDataFrameInfo(stream_id, available_window, state); QUICHE_VLOG(2) << "WriteForStream | length: " << info.payload_length << " end_data: " << info.end_data + << " end_stream: " << info.end_stream << " trailers: " << state.trailers.get(); if (info.payload_length == 0 && !info.end_data && state.trailers == nullptr) { @@ -891,9 +893,9 @@ // No more work on the stream; it has been closed. break; } - if (info.payload_length > 0 || info.send_fin) { + if (info.payload_length > 0 || info.end_stream) { spdy::SpdyDataIR data(stream_id); - data.set_fin(info.send_fin); + data.set_fin(info.end_stream); data.SetDataShallow(info.payload_length); spdy::SpdySerializedFrame header = spdy::SpdyFramer::SerializeDataFrameHeaderWithPaddingLengthField( @@ -910,13 +912,13 @@ state.send_window -= info.payload_length; available_window = std::min({connection_send_window_, state.send_window, static_cast<int32_t>(max_frame_payload_)}); - if (info.send_fin) { + if (info.end_stream) { state.half_closed_local = true; MaybeFinWithRstStream(it); } const bool ok = AfterFrameSent(/* DATA */ 0, stream_id, info.payload_length, - info.send_fin ? END_STREAM_FLAG : 0x0, 0); + info.end_stream ? END_STREAM_FLAG : 0x0, 0); if (!ok) { LatchErrorAndNotify(Http2ErrorCode::INTERNAL_ERROR, ConnectionError::kSendError); @@ -933,7 +935,7 @@ // send, it's okay to send the trailers. if (state.trailers != nullptr) { auto block_ptr = std::move(state.trailers); - if (info.send_fin) { + if (info.end_stream) { QUICHE_LOG(ERROR) << "Sent fin; can't send trailers."; // TODO(birenroy,diannahu): Consider queuing a RST_STREAM @@ -2076,26 +2078,26 @@ stream_state.check_visitor_for_body = false; } -OgHttp2Session::DataFrameInfo OgHttp2Session::GetDataFrameInfo( +OgHttp2Session::DataFrameHeaderInfo OgHttp2Session::GetDataFrameInfo( Http2StreamId stream_id, size_t flow_control_available, StreamState& stream_state) { - DataFrameInfo info{.payload_length = 0, .end_data = true, .send_fin = true}; if (stream_state.outbound_body != nullptr) { + DataFrameHeaderInfo info; std::tie(info.payload_length, info.end_data) = stream_state.outbound_body->SelectPayloadLength(flow_control_available); - info.send_fin = + info.end_stream = info.end_data ? stream_state.outbound_body->send_fin() : false; + return info; } else if (stream_state.check_visitor_for_body) { - DataFrameHeaderInfo visitor_info = + DataFrameHeaderInfo info = visitor_.OnReadyToSendDataForStream(stream_id, flow_control_available); - info.payload_length = visitor_info.payload_length; - info.end_data = visitor_info.end_data || visitor_info.end_stream; - info.send_fin = visitor_info.end_stream; - } else { - QUICHE_LOG(DFATAL) << "GetDataFrameInfo for stream " << stream_id - << " but no body available!"; + info.end_data = info.end_data || info.end_stream; + return info; } - return info; + QUICHE_LOG(DFATAL) << "GetDataFrameInfo for stream " << stream_id + << " but no body available!"; + return DataFrameHeaderInfo{ + .payload_length = 0, .end_data = true, .end_stream = true}; } bool OgHttp2Session::SendDataFrame(Http2StreamId stream_id,
diff --git a/quiche/http2/adapter/oghttp2_session.h b/quiche/http2/adapter/oghttp2_session.h index 8d6756f..ab13737 100644 --- a/quiche/http2/adapter/oghttp2_session.h +++ b/quiche/http2/adapter/oghttp2_session.h
@@ -471,14 +471,10 @@ void AbandonData(StreamState& stream_state); // Gathers information required to construct a DATA frame header. - struct DataFrameInfo { - int64_t payload_length; - bool end_data; - bool send_fin; - }; - DataFrameInfo GetDataFrameInfo(Http2StreamId stream_id, - size_t flow_control_available, - StreamState& stream_state); + using DataFrameHeaderInfo = Http2VisitorInterface::DataFrameHeaderInfo; + DataFrameHeaderInfo GetDataFrameInfo(Http2StreamId stream_id, + size_t flow_control_available, + StreamState& stream_state); // Invokes the appropriate API to send a DATA frame header and payload. bool SendDataFrame(Http2StreamId stream_id, absl::string_view frame_header,