Refine IndeterminateLengthMessageSection enum for BinaryHttpResponse encoding.

The IndeterminateLengthMessageSection enum is updated to provide more granular states, which will be needed for the response decoder implementation.

PiperOrigin-RevId: 854214614
diff --git a/quiche/binary_http/binary_http_message.cc b/quiche/binary_http/binary_http_message.cc
index 2ee5302..b91b3b1 100644
--- a/quiche/binary_http/binary_http_message.cc
+++ b/quiche/binary_http/binary_http_message.cc
@@ -884,7 +884,8 @@
     return field_section_length.status();
   }
   uint64_t total_length = *field_section_length;
-  if (!framing_indicator_encoded_) {
+  if (current_section_ ==
+      IndeterminateLengthMessageSection::kFramingIndicator) {
     total_length += quiche::QuicheDataWriter::GetVarInt62Len(
         kIndeterminateLengthResponseFraming);
   }
@@ -895,11 +896,13 @@
   std::string data(total_length, '\0');
   QuicheDataWriter writer(total_length, data.data());
 
-  if (!framing_indicator_encoded_) {
+  if (current_section_ ==
+      IndeterminateLengthMessageSection::kFramingIndicator) {
     if (!writer.WriteVarInt62(kIndeterminateLengthResponseFraming)) {
       return absl::InternalError("Failed to write framing indicator.");
     }
-    framing_indicator_encoded_ = true;
+    current_section_ =
+        IndeterminateLengthMessageSection::kInformationalOrFinalStatusCode;
   }
   if (status_code.has_value() && !writer.WriteVarInt62(*status_code)) {
     return absl::InternalError("Failed to write status code.");
@@ -918,12 +921,20 @@
 BinaryHttpResponse::IndeterminateLengthEncoder::GetMessageSectionString(
     IndeterminateLengthMessageSection section) const {
   switch (section) {
-    case IndeterminateLengthMessageSection::kInformationalResponseOrHeader:
-      return "InformationalResponseOrHeader";
+    case IndeterminateLengthMessageSection::kFramingIndicator:
+      return "FramingIndicator";
+    case IndeterminateLengthMessageSection::kInformationalOrFinalStatusCode:
+      return "InformationalOrFinalStatusCode";
+    case IndeterminateLengthMessageSection::kInformationalResponseHeader:
+      return "InformationalResponseHeader";
+    case IndeterminateLengthMessageSection::kFinalResponseHeader:
+      return "FinalResponseHeader";
     case IndeterminateLengthMessageSection::kBody:
       return "Body";
     case IndeterminateLengthMessageSection::kTrailer:
       return "Trailer";
+    case IndeterminateLengthMessageSection::kPadding:
+      return "Padding";
     case IndeterminateLengthMessageSection::kEnd:
       return "End";
     default:
@@ -935,7 +946,9 @@
 BinaryHttpResponse::IndeterminateLengthEncoder::EncodeInformationalResponse(
     uint16_t status_code, absl::Span<FieldView> fields) {
   if (current_section_ !=
-      IndeterminateLengthMessageSection::kInformationalResponseOrHeader) {
+          IndeterminateLengthMessageSection::kFramingIndicator &&
+      current_section_ !=
+          IndeterminateLengthMessageSection::kInformationalOrFinalStatusCode) {
     current_section_ = IndeterminateLengthMessageSection::kEnd;
     return absl::InvalidArgumentError(absl::StrCat(
         "EncodeInformationalResponse called in incorrect section: ",
@@ -951,7 +964,8 @@
   if (!data.ok()) {
     current_section_ = IndeterminateLengthMessageSection::kEnd;
   }
-
+  current_section_ =
+      IndeterminateLengthMessageSection::kInformationalOrFinalStatusCode;
   return data;
 }
 
@@ -959,7 +973,9 @@
 BinaryHttpResponse::IndeterminateLengthEncoder::EncodeHeaders(
     uint16_t status_code, absl::Span<FieldView> headers) {
   if (current_section_ !=
-      IndeterminateLengthMessageSection::kInformationalResponseOrHeader) {
+          IndeterminateLengthMessageSection::kFramingIndicator &&
+      current_section_ !=
+          IndeterminateLengthMessageSection::kInformationalOrFinalStatusCode) {
     current_section_ = IndeterminateLengthMessageSection::kEnd;
     return absl::InvalidArgumentError(
         absl::StrCat("EncodeHeaders called in incorrect section: ",
diff --git a/quiche/binary_http/binary_http_message.h b/quiche/binary_http/binary_http_message.h
index da467f9..921249c 100644
--- a/quiche/binary_http/binary_http_message.h
+++ b/quiche/binary_http/binary_http_message.h
@@ -421,9 +421,13 @@
 
  private:
   enum class IndeterminateLengthMessageSection {
-    kInformationalResponseOrHeader,
+    kFramingIndicator,
+    kInformationalOrFinalStatusCode,
+    kInformationalResponseHeader,
+    kFinalResponseHeader,
     kBody,
     kTrailer,
+    kPadding,
     kEnd,
   };
   // Returns Binary Http known length request formatted response.
@@ -463,8 +467,7 @@
       IndeterminateLengthMessageSection section) const;
 
   IndeterminateLengthMessageSection current_section_ =
-      IndeterminateLengthMessageSection::kInformationalResponseOrHeader;
-  bool framing_indicator_encoded_ = false;
+      IndeterminateLengthMessageSection::kFramingIndicator;
 };
 
 void QUICHE_EXPORT PrintTo(const BinaryHttpResponse& msg, std::ostream* os);