Collapse InformationalResponseInternal class into public InformationalResponse.

PiperOrigin-RevId: 473325494
diff --git a/quiche/binary_http/binary_http_message.cc b/quiche/binary_http/binary_http_message.cc
index 360c56d..1a6a149 100644
--- a/quiche/binary_http/binary_http_message.cc
+++ b/quiche/binary_http/binary_http_message.cc
@@ -228,7 +228,7 @@
   if (status_code > 199) {
     return absl::InvalidArgumentError("status code > 199");
   }
-  InformationalResponseInternal data(status_code);
+  InformationalResponse data(status_code);
   for (Field& header : header_fields) {
     data.AddField(header.name, std::move(header.value));
   }
@@ -241,16 +241,6 @@
   return EncodeAsKnownLength();
 }
 
-std::vector<BinaryHttpResponse::InformationalResponse>
-BinaryHttpResponse::GetInformationalResponse() const {
-  std::vector<InformationalResponse> data;
-  data.reserve(informational_response_control_data_.size());
-  for (const auto& control_data : informational_response_control_data_) {
-    data.push_back({control_data.response_code(), control_data.fields()});
-  }
-  return data;
-}
-
 absl::StatusOr<std::string> BinaryHttpResponse::EncodeAsKnownLength() const {
   std::string data;
   data.resize(EncodedSize());
@@ -285,21 +275,20 @@
          EncodedKnownLengthFieldsAndBodySize();
 }
 
-void BinaryHttpResponse::InformationalResponseInternal::AddField(
-    absl::string_view name, std::string value) {
+void BinaryHttpResponse::InformationalResponse::AddField(absl::string_view name,
+                                                         std::string value) {
   fields_.AddField({absl::AsciiStrToLower(name), std::move(value)});
 }
 
 // Appends the encoded fields and body to data.
-absl::Status BinaryHttpResponse::InformationalResponseInternal::Encode(
+absl::Status BinaryHttpResponse::InformationalResponse::Encode(
     quiche::QuicheDataWriter& writer) const {
-  writer.WriteVarInt62(response_code_);
+  writer.WriteVarInt62(status_code_);
   return fields_.Encode(writer);
 }
 
-uint64_t BinaryHttpResponse::InformationalResponseInternal::EncodedSize()
-    const {
-  return quiche::QuicheDataWriter::GetVarInt62Len(response_code_) +
+uint64_t BinaryHttpResponse::InformationalResponse::EncodedSize() const {
+  return quiche::QuicheDataWriter::GetVarInt62Len(status_code_) +
          fields_.EncodedSize();
 }
 
diff --git a/quiche/binary_http/binary_http_message.h b/quiche/binary_http/binary_http_message.h
index 843b860..e49b6a9 100644
--- a/quiche/binary_http/binary_http_message.h
+++ b/quiche/binary_http/binary_http_message.h
@@ -60,6 +60,10 @@
       return fields_;
     }
 
+    bool operator==(const BinaryHttpMessage::Fields& rhs) const {
+      return fields_ == rhs.fields_;
+    }
+
     // Encode fields in insertion order.
     // https://www.ietf.org/archive/id/draft-ietf-httpbis-binary-message-06.html#name-header-and-trailer-field-li
     absl::Status Encode(quiche::QuicheDataWriter& writer) const;
@@ -129,14 +133,47 @@
 class QUICHE_EXPORT_PRIVATE BinaryHttpResponse : public BinaryHttpMessage {
  public:
   // https://www.ietf.org/archive/id/draft-ietf-httpbis-binary-message-06.html#name-response-control-data
-  struct InformationalResponse {
-    uint16_t status_code;
-    const std::vector<Field>& header_fields;
+  // A response can contain 0 to N informational responses.  Each informational
+  // response contains a status code followed by a header field. Valid status
+  // codes are [100,199].
+  class InformationalResponse {
+   public:
+    explicit InformationalResponse(uint16_t status_code)
+        : status_code_(status_code) {}
+    InformationalResponse(uint16_t status_code,
+                          const std::vector<BinaryHttpMessage::Field>& fields)
+        : status_code_(status_code) {
+      for (const BinaryHttpMessage::Field& field : fields) {
+        AddField(field.name, field.value);
+      }
+    }
+
     bool operator==(
         const BinaryHttpResponse::InformationalResponse& rhs) const {
-      return status_code == rhs.status_code &&
-             header_fields == rhs.header_fields;
+      return status_code_ == rhs.status_code_ && fields_ == rhs.fields_;
     }
+
+    // Adds a field with the provided name, converted to lower case.
+    // Fields are in the order they are added.
+    void AddField(absl::string_view name, std::string value);
+
+    const std::vector<BinaryHttpMessage::Field>& fields() const {
+      return fields_.fields();
+    }
+
+    uint16_t status_code() const { return status_code_; }
+
+   private:
+    // Give BinaryHttpResponse access to Encoding functionality.
+    friend class BinaryHttpResponse;
+
+    uint64_t EncodedSize() const;
+
+    // Appends the encoded fields and body to `writer`.
+    absl::Status Encode(quiche::QuicheDataWriter& writer) const;
+
+    const uint16_t status_code_;
+    BinaryHttpMessage::Fields fields_;
   };
 
   explicit BinaryHttpResponse(uint16_t status_code)
@@ -152,45 +189,20 @@
                                         std::vector<Field> header_fields);
 
   uint16_t status_code() const { return status_code_; }
+
   // References in the returned `ResponseControlData` are invalidated on
   // `BinaryHttpResponse` object mutations.
-  std::vector<InformationalResponse> GetInformationalResponse() const;
+  const std::vector<InformationalResponse>& informational_responses() const {
+    return informational_response_control_data_;
+  }
 
  private:
-  //
-  // Valid response codes are [100,199].
-  // TODO(bschneider): Collapse this inner class into the public
-  // `InformationalResponse` struct.
-  class InformationalResponseInternal {
-   public:
-    explicit InformationalResponseInternal(uint16_t response_code)
-        : response_code_(response_code) {}
-
-    void AddField(absl::string_view name, std::string value);
-
-    // Appends the encoded fields and body to `writer`.
-    absl::Status Encode(quiche::QuicheDataWriter& writer) const;
-
-    uint64_t EncodedSize() const;
-
-    uint16_t response_code() const { return response_code_; }
-
-    const std::vector<BinaryHttpMessage::Field>& fields() const {
-      return fields_.fields();
-    }
-
-   private:
-    const uint16_t response_code_;
-    BinaryHttpMessage::Fields fields_;
-  };
-
   // Returns Binary Http known length request formatted response.
   absl::StatusOr<std::string> EncodeAsKnownLength() const;
 
   uint64_t EncodedSize() const;
 
-  std::vector<InformationalResponseInternal>
-      informational_response_control_data_;
+  std::vector<InformationalResponse> informational_response_control_data_;
   const uint16_t status_code_;
 };
 }  // namespace quiche
diff --git a/quiche/binary_http/binary_http_message_test.cc b/quiche/binary_http/binary_http_message_test.cc
index 581848e..7d22bf3 100644
--- a/quiche/binary_http/binary_http_message_test.cc
+++ b/quiche/binary_http/binary_http_message_test.cc
@@ -264,7 +264,7 @@
       {"server", "Apache"}};
   ASSERT_THAT(response.GetHeaderFields(), ContainerEq(expected_fields));
   ASSERT_EQ(response.body(), "");
-  ASSERT_TRUE(response.GetInformationalResponse().empty());
+  ASSERT_TRUE(response.informational_responses().empty());
 }
 
 TEST(BinaryHttpResponse, EncodeBody) {
@@ -318,7 +318,7 @@
       {"server", "Apache"}};
   ASSERT_THAT(response.GetHeaderFields(), ContainerEq(expected_fields));
   ASSERT_EQ(response.body(), "Hello, world!\r\n");
-  ASSERT_TRUE(response.GetInformationalResponse().empty());
+  ASSERT_TRUE(response.informational_responses().empty());
 }
 
 TEST(BHttpResponse, AddBadInformationalResponseCode) {
@@ -482,7 +482,7 @@
       {"link", "</script.js>; rel=preload; as=script"}};
   std::vector<BinaryHttpResponse::InformationalResponse> expected_control = {
       {102, header102}, {103, header103}};
-  ASSERT_THAT(response.GetInformationalResponse(),
+  ASSERT_THAT(response.informational_responses(),
               ContainerEq(expected_control));
 }