Add max_header_list_size argument to QpackDecodedHeadersAccumulator constructor.
This will be used in cr/231494986.
gfe-relnote: n/a. Change to unused code.
PiperOrigin-RevId: 243792811
Change-Id: If8cdf715eb7d2a6a0af02be74d05f74eff8a6219
diff --git a/quic/core/qpack/qpack_decoded_headers_accumulator.cc b/quic/core/qpack/qpack_decoded_headers_accumulator.cc
index ac60fce..bcfe0e4 100644
--- a/quic/core/qpack/qpack_decoded_headers_accumulator.cc
+++ b/quic/core/qpack/qpack_decoded_headers_accumulator.cc
@@ -10,11 +10,13 @@
QpackDecodedHeadersAccumulator::QpackDecodedHeadersAccumulator(
QuicStreamId id,
- QpackDecoder* qpack_decoder)
+ QpackDecoder* qpack_decoder,
+ size_t max_header_list_size)
: decoder_(qpack_decoder->DecodeHeaderBlock(id, this)),
uncompressed_header_bytes_(0),
compressed_header_bytes_(0),
error_detected_(false) {
+ quic_header_list_.set_max_header_list_size(max_header_list_size);
quic_header_list_.OnHeaderBlockStart();
}
diff --git a/quic/core/qpack/qpack_decoded_headers_accumulator.h b/quic/core/qpack/qpack_decoded_headers_accumulator.h
index f9e8feb..5db88d7 100644
--- a/quic/core/qpack/qpack_decoded_headers_accumulator.h
+++ b/quic/core/qpack/qpack_decoded_headers_accumulator.h
@@ -24,7 +24,9 @@
class QUIC_EXPORT_PRIVATE QpackDecodedHeadersAccumulator
: public QpackProgressiveDecoder::HeadersHandlerInterface {
public:
- QpackDecodedHeadersAccumulator(QuicStreamId id, QpackDecoder* qpack_decoder);
+ QpackDecodedHeadersAccumulator(QuicStreamId id,
+ QpackDecoder* qpack_decoder,
+ size_t max_header_list_size);
virtual ~QpackDecodedHeadersAccumulator() = default;
// QpackProgressiveDecoder::HeadersHandlerInterface implementation.
diff --git a/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc b/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc
index eb6f622..c3c0b81 100644
--- a/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc
+++ b/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc
@@ -20,8 +20,12 @@
namespace test {
namespace {
+// Arbitrary stream ID used for testing.
QuicStreamId kTestStreamId = 1;
+// Limit on header list size.
+const size_t kMaxHeaderListSize = 100;
+
// Header Acknowledgement decoder stream instruction with stream_id = 1.
const char* const kHeaderAcknowledgement = "\x81";
@@ -32,7 +36,7 @@
QpackDecodedHeadersAccumulatorTest()
: qpack_decoder_(&encoder_stream_error_delegate_,
&decoder_stream_sender_delegate_),
- accumulator_(kTestStreamId, &qpack_decoder_) {}
+ accumulator_(kTestStreamId, &qpack_decoder_, kMaxHeaderListSize) {}
NoopEncoderStreamErrorDelegate encoder_stream_error_delegate_;
StrictMock<MockDecoderStreamSenderDelegate> decoder_stream_sender_delegate_;
@@ -93,5 +97,23 @@
EXPECT_EQ(encoded_data.size(), header_list.compressed_header_bytes());
}
+TEST_F(QpackDecodedHeadersAccumulatorTest, ExceedingLimit) {
+ EXPECT_CALL(decoder_stream_sender_delegate_,
+ WriteDecoderStreamData(Eq(kHeaderAcknowledgement)));
+
+ // Total length of header list exceeds kMaxHeaderListSize.
+ EXPECT_TRUE(accumulator_.Decode(QuicTextUtils::HexDecode(
+ "0000" // header block prefix
+ "26666f6f626172" // header key: "foobar"
+ "7d61616161616161616161616161616161616161" // header value: 'a' 125 times
+ "616161616161616161616161616161616161616161616161616161616161616161616161"
+ "616161616161616161616161616161616161616161616161616161616161616161616161"
+ "61616161616161616161616161616161616161616161616161616161616161616161")));
+ EXPECT_TRUE(accumulator_.EndHeaderBlock());
+
+ // QuicHeaderList signals header list over limit by clearing it.
+ EXPECT_TRUE(accumulator_.quic_header_list().empty());
+}
+
} // namespace test
} // namespace quic