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,