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