Revert "Internal QUICHE change" This reverts commit 7805361f3a79b463da1e88a9e307a2455d819a0a.
diff --git a/quic/core/qpack/qpack_encoder.cc b/quic/core/qpack/qpack_encoder.cc index 09c4286..108ffd5 100644 --- a/quic/core/qpack/qpack_encoder.cc +++ b/quic/core/qpack/qpack_encoder.cc
@@ -9,6 +9,7 @@ #include "net/third_party/quiche/src/quic/core/qpack/qpack_progressive_encoder.h" #include "net/third_party/quiche/src/quic/platform/api/quic_logging.h" #include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" namespace quic {
diff --git a/quic/core/qpack/qpack_encoder.h b/quic/core/qpack/qpack_encoder.h index 2c450b1..4e65532 100644 --- a/quic/core/qpack/qpack_encoder.h +++ b/quic/core/qpack/qpack_encoder.h
@@ -13,7 +13,6 @@ #include "net/third_party/quiche/src/quic/core/qpack/qpack_header_table.h" #include "net/third_party/quiche/src/quic/core/quic_types.h" #include "net/third_party/quiche/src/quic/platform/api/quic_export.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" #include "net/third_party/quiche/src/spdy/core/hpack/hpack_encoder.h" namespace spdy {
diff --git a/quic/core/qpack/qpack_encoder_test.cc b/quic/core/qpack/qpack_encoder_test.cc index 8200e14..49edadc 100644 --- a/quic/core/qpack/qpack_encoder_test.cc +++ b/quic/core/qpack/qpack_encoder_test.cc
@@ -162,19 +162,6 @@ QuicTextUtils::HexDecode("ffffffffffffffffffffff")); } -TEST_P(QpackEncoderTest, SplitAlongNullCharacter) { - spdy::SpdyHeaderBlock header_list; - header_list["foo"] = QuicStringPiece("bar\0bar\0baz", 11); - std::string output = Encode(&header_list); - - EXPECT_EQ(QuicTextUtils::HexDecode("0000" // prefix - "2a94e703626172" // foo: bar - "2a94e703626172" // foo: bar - "2a94e70362617a" // foo: baz - ), - output); -} - } // namespace } // namespace test } // namespace quic
diff --git a/quic/core/qpack/qpack_progressive_encoder.cc b/quic/core/qpack/qpack_progressive_encoder.cc index 731ec10..05a025b 100644 --- a/quic/core/qpack/qpack_progressive_encoder.cc +++ b/quic/core/qpack/qpack_progressive_encoder.cc
@@ -22,7 +22,7 @@ header_table_(header_table), encoder_stream_sender_(encoder_stream_sender), header_list_(header_list), - header_list_iterator_(header_list_.begin()), + header_list_iterator_(header_list_->begin()), prefix_encoded_(false) { // TODO(bnc): Use |stream_id_| for dynamic table entry management, and // remove this dummy DCHECK. @@ -30,10 +30,11 @@ DCHECK(header_table_); DCHECK(encoder_stream_sender_); + DCHECK(header_list_); } bool QpackProgressiveEncoder::HasNext() const { - return header_list_iterator_ != header_list_.end() || !prefix_encoded_; + return header_list_iterator_ != header_list_->end() || !prefix_encoded_; } void QpackProgressiveEncoder::Next(size_t max_encoded_bytes, @@ -60,7 +61,7 @@ } do { - // Call QpackInstructionEncoder::Encode() for |*header_list_iterator_| if it + // Call QpackInstructionEncoder::Encode for |*header_list_iterator_| if it // has not been called yet. if (!instruction_encoder_.HasNext()) { DCHECK(prefix_encoded_);
diff --git a/quic/core/qpack/qpack_progressive_encoder.h b/quic/core/qpack/qpack_progressive_encoder.h index 98a3cfe..8e204e2 100644 --- a/quic/core/qpack/qpack_progressive_encoder.h +++ b/quic/core/qpack/qpack_progressive_encoder.h
@@ -9,7 +9,6 @@ #include "net/third_party/quiche/src/quic/core/qpack/qpack_encoder_stream_sender.h" #include "net/third_party/quiche/src/quic/core/qpack/qpack_instruction_encoder.h" -#include "net/third_party/quiche/src/quic/core/qpack/value_splitting_header_list.h" #include "net/third_party/quiche/src/quic/core/quic_types.h" #include "net/third_party/quiche/src/quic/platform/api/quic_export.h" #include "net/third_party/quiche/src/spdy/core/hpack/hpack_encoder.h" @@ -25,8 +24,6 @@ : public spdy::HpackEncoder::ProgressiveEncoder { public: QpackProgressiveEncoder() = delete; - // |header_table|, |encoder_stream_sender|, and |header_list| must all outlive - // this object. QpackProgressiveEncoder(QuicStreamId stream_id, QpackHeaderTable* header_table, QpackEncoderStreamSender* encoder_stream_sender, @@ -46,10 +43,10 @@ QpackInstructionEncoder instruction_encoder_; const QpackHeaderTable* const header_table_; QpackEncoderStreamSender* const encoder_stream_sender_; - const ValueSplittingHeaderList header_list_; + const spdy::SpdyHeaderBlock* const header_list_; // Header field currently being encoded. - ValueSplittingHeaderList::const_iterator header_list_iterator_; + spdy::SpdyHeaderBlock::const_iterator header_list_iterator_; // False until prefix is fully encoded. bool prefix_encoded_;
diff --git a/quic/core/qpack/qpack_round_trip_test.cc b/quic/core/qpack/qpack_round_trip_test.cc index 45ad667..8ef05c4 100644 --- a/quic/core/qpack/qpack_round_trip_test.cc +++ b/quic/core/qpack/qpack_round_trip_test.cc
@@ -131,14 +131,6 @@ } } -TEST_P(QpackRoundTripTest, ValueHasNullCharacter) { - spdy::SpdyHeaderBlock header_list; - header_list["foo"] = QuicStringPiece("bar\0bar\0baz", 11); - - spdy::SpdyHeaderBlock output = EncodeThenDecode(header_list); - EXPECT_EQ(header_list, output); -} - } // namespace } // namespace test } // namespace quic
diff --git a/quic/core/qpack/value_splitting_header_list.cc b/quic/core/qpack/value_splitting_header_list.cc deleted file mode 100644 index d8a0ee8..0000000 --- a/quic/core/qpack/value_splitting_header_list.cc +++ /dev/null
@@ -1,88 +0,0 @@ -// Copyright (c) 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/third_party/quiche/src/quic/core/qpack/value_splitting_header_list.h" - -namespace quic { - -ValueSplittingHeaderList::const_iterator::const_iterator( - const spdy::SpdyHeaderBlock* header_list, - spdy::SpdyHeaderBlock::const_iterator header_list_iterator) - : header_list_(header_list), - header_list_iterator_(header_list_iterator), - value_start_(0) { - UpdateHeaderField(); -} - -bool ValueSplittingHeaderList::const_iterator::operator==( - const const_iterator& other) const { - return header_list_iterator_ == other.header_list_iterator_ && - value_start_ == other.value_start_; -} - -bool ValueSplittingHeaderList::const_iterator::operator!=( - const const_iterator& other) const { - return !(*this == other); -} - -const ValueSplittingHeaderList::const_iterator& -ValueSplittingHeaderList::const_iterator::operator++() { - if (value_end_ == QuicStringPiece::npos) { - // This was the last frament within |*header_list_iterator_|, - // move on to the next header element of |header_list_|. - ++header_list_iterator_; - value_start_ = 0; - } else { - // Find the next fragment within |*header_list_iterator_|. - value_start_ = value_end_ + 1; - } - UpdateHeaderField(); - - return *this; -} - -const ValueSplittingHeaderList::value_type& - ValueSplittingHeaderList::const_iterator::operator*() const { - return header_field_; -} -const ValueSplittingHeaderList::value_type* - ValueSplittingHeaderList::const_iterator::operator->() const { - return &header_field_; -} - -void ValueSplittingHeaderList::const_iterator::UpdateHeaderField() { - DCHECK(value_start_ != QuicStringPiece::npos); - - if (header_list_iterator_ == header_list_->end()) { - return; - } - - const QuicStringPiece name = header_list_iterator_->first; - - value_end_ = header_list_iterator_->second.find('\0', value_start_); - const QuicStringPiece::size_type value_length = - value_end_ == QuicStringPiece::npos ? QuicStringPiece::npos - : value_end_ - value_start_; - const QuicStringPiece value = - header_list_iterator_->second.substr(value_start_, value_length); - - header_field_ = std::make_pair(name, value); -} - -ValueSplittingHeaderList::ValueSplittingHeaderList( - const spdy::SpdyHeaderBlock* header_list) - : header_list_(header_list) { - DCHECK(header_list_); -} - -ValueSplittingHeaderList::const_iterator ValueSplittingHeaderList::begin() - const { - return const_iterator(header_list_, header_list_->begin()); -} - -ValueSplittingHeaderList::const_iterator ValueSplittingHeaderList::end() const { - return const_iterator(header_list_, header_list_->end()); -} - -} // namespace quic
diff --git a/quic/core/qpack/value_splitting_header_list.h b/quic/core/qpack/value_splitting_header_list.h deleted file mode 100644 index e47567e..0000000 --- a/quic/core/qpack/value_splitting_header_list.h +++ /dev/null
@@ -1,61 +0,0 @@ -// Copyright (c) 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef QUICHE_QUIC_CORE_QPACK_VALUE_SPLITTING_HEADER_LIST_H_ -#define QUICHE_QUIC_CORE_QPACK_VALUE_SPLITTING_HEADER_LIST_H_ - -#include "net/third_party/quiche/src/quic/platform/api/quic_export.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" -#include "net/third_party/quiche/src/spdy/core/spdy_header_block.h" - -namespace quic { - -// A wrapper class around SpdyHeaderBlock that splits header values along '\0' -// characters. -class QUIC_EXPORT_PRIVATE ValueSplittingHeaderList { - public: - using value_type = spdy::SpdyHeaderBlock::value_type; - - class const_iterator { - public: - // |header_list| must outlive this object. - const_iterator(const spdy::SpdyHeaderBlock* header_list, - spdy::SpdyHeaderBlock::const_iterator header_list_iterator); - const_iterator(const const_iterator&) = default; - const_iterator& operator=(const const_iterator&) = default; - - bool operator==(const const_iterator& other) const; - bool operator!=(const const_iterator& other) const; - - const const_iterator& operator++(); - - const value_type& operator*() const; - const value_type* operator->() const; - - private: - // Find next '\0' character; update |value_end_| and |header_field_|. - void UpdateHeaderField(); - - const spdy::SpdyHeaderBlock* const header_list_; - spdy::SpdyHeaderBlock::const_iterator header_list_iterator_; - QuicStringPiece::size_type value_start_; - QuicStringPiece::size_type value_end_; - value_type header_field_; - }; - - // |header_list| must outlive this object. - explicit ValueSplittingHeaderList(const spdy::SpdyHeaderBlock* header_list); - ValueSplittingHeaderList(const ValueSplittingHeaderList&) = delete; - ValueSplittingHeaderList& operator=(const ValueSplittingHeaderList&) = delete; - - const_iterator begin() const; - const_iterator end() const; - - private: - const spdy::SpdyHeaderBlock* const header_list_; -}; - -} // namespace quic - -#endif // QUICHE_QUIC_CORE_QPACK_VALUE_SPLITTING_HEADER_LIST_H_
diff --git a/quic/core/qpack/value_splitting_header_list_test.cc b/quic/core/qpack/value_splitting_header_list_test.cc deleted file mode 100644 index 9ece65d..0000000 --- a/quic/core/qpack/value_splitting_header_list_test.cc +++ /dev/null
@@ -1,121 +0,0 @@ -// Copyright (c) 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/third_party/quiche/src/quic/core/qpack/value_splitting_header_list.h" - -#include "net/third_party/quiche/src/quic/platform/api/quic_test.h" - -namespace quic { -namespace test { -namespace { - -using ::testing::ElementsAre; -using ::testing::Pair; - -TEST(ValueSplittingHeaderListTest, Comparison) { - spdy::SpdyHeaderBlock block; - block["foo"] = QuicStringPiece("bar\0baz", 7); - block["baz"] = "qux"; - - ValueSplittingHeaderList headers(&block); - ValueSplittingHeaderList::const_iterator it1 = headers.begin(); - const int kEnd = 4; - for (int i = 0; i < kEnd; ++i) { - // Compare to begin(). - if (i == 0) { - EXPECT_TRUE(it1 == headers.begin()); - EXPECT_TRUE(headers.begin() == it1); - EXPECT_FALSE(it1 != headers.begin()); - EXPECT_FALSE(headers.begin() != it1); - } else { - EXPECT_FALSE(it1 == headers.begin()); - EXPECT_FALSE(headers.begin() == it1); - EXPECT_TRUE(it1 != headers.begin()); - EXPECT_TRUE(headers.begin() != it1); - } - - // Compare to end(). - if (i == kEnd - 1) { - EXPECT_TRUE(it1 == headers.end()); - EXPECT_TRUE(headers.end() == it1); - EXPECT_FALSE(it1 != headers.end()); - EXPECT_FALSE(headers.end() != it1); - } else { - EXPECT_FALSE(it1 == headers.end()); - EXPECT_FALSE(headers.end() == it1); - EXPECT_TRUE(it1 != headers.end()); - EXPECT_TRUE(headers.end() != it1); - } - - // Compare to another iterator walking through the container. - ValueSplittingHeaderList::const_iterator it2 = headers.begin(); - for (int j = 0; j < kEnd; ++j) { - if (i == j) { - EXPECT_TRUE(it1 == it2); - EXPECT_FALSE(it1 != it2); - } else { - EXPECT_FALSE(it1 == it2); - EXPECT_TRUE(it1 != it2); - } - ++it2; - } - - ++it1; - } -} - -TEST(ValueSplittingHeaderListTest, Empty) { - spdy::SpdyHeaderBlock block; - - ValueSplittingHeaderList headers(&block); - EXPECT_THAT(headers, ElementsAre()); - EXPECT_EQ(headers.begin(), headers.end()); -} - -TEST(ValueSplittingHeaderListTest, Simple) { - spdy::SpdyHeaderBlock block; - block["foo"] = "bar"; - block["baz"] = "qux"; - - ValueSplittingHeaderList headers(&block); - EXPECT_THAT(headers, ElementsAre(Pair("foo", "bar"), Pair("baz", "qux"))); - EXPECT_NE(headers.begin(), headers.end()); -} - -TEST(ValueSplittingHeaderListTest, EmptyValue) { - spdy::SpdyHeaderBlock block; - block["foo"] = ""; - - ValueSplittingHeaderList headers(&block); - EXPECT_THAT(headers, ElementsAre(Pair("foo", ""))); -} - -TEST(ValueSplittingHeaderListTest, SimpleSplit) { - spdy::SpdyHeaderBlock block; - block["foo"] = QuicStringPiece("bar\0baz", 7); - block["baz"] = QuicStringPiece("foo\0foo", 7); - - ValueSplittingHeaderList headers(&block); - EXPECT_THAT(headers, ElementsAre(Pair("foo", "bar"), Pair("foo", "baz"), - Pair("baz", "foo"), Pair("baz", "foo"))); -} - -TEST(ValueSplittingHeaderListTest, EmptyFragments) { - spdy::SpdyHeaderBlock block; - block["foo"] = QuicStringPiece("\0", 1); - block["bar"] = QuicStringPiece("foo\0", 4); - block["baz"] = QuicStringPiece("\0bar", 4); - block["qux"] = QuicStringPiece("\0foobar\0", 8); - - ValueSplittingHeaderList headers(&block); - EXPECT_THAT( - headers, - ElementsAre(Pair("foo", ""), Pair("foo", ""), Pair("bar", "foo"), - Pair("bar", ""), Pair("baz", ""), Pair("baz", "bar"), - Pair("qux", ""), Pair("qux", "foobar"), Pair("qux", ""))); -} - -} // namespace -} // namespace test -} // namespace quic