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)); }