Add flag to allow Qpack decoder to omit header overhead when counting header size against such upper limit. These new flag will be used in Envoy. PiperOrigin-RevId: 366167310 Change-Id: I8e8130ab17a0ecc86048acadff42a5f003ed0263
diff --git a/quic/core/http/quic_spdy_stream_test.cc b/quic/core/http/quic_spdy_stream_test.cc index c84203d..dca6f92 100644 --- a/quic/core/http/quic_spdy_stream_test.cc +++ b/quic/core/http/quic_spdy_stream_test.cc
@@ -557,6 +557,23 @@ EXPECT_THAT(stream_->stream_error(), IsStreamError(QUIC_HEADERS_TOO_LARGE)); } +TEST_P(QuicSpdyStreamTest, QpackProcessLargeHeaderListDiscountOverhead) { + if (!UsesHttp3()) { + return; + } + // Setting this flag to false causes no per-entry overhead to be included + // in the header size. + SetQuicFlag(FLAGS_quic_header_size_limit_includes_overhead, false); + Initialize(kShouldProcessData); + session_->set_max_inbound_header_list_size(40); + std::string headers = + HeadersFrame({std::make_pair("foo", "too long headers")}); + + QuicStreamFrame frame(stream_->id(), false, 0, headers); + stream_->OnStreamFrame(frame); + EXPECT_THAT(stream_->stream_error(), IsStreamError(QUIC_STREAM_NO_ERROR)); +} + TEST_P(QuicSpdyStreamTest, ProcessHeaderListWithFin) { Initialize(kShouldProcessData);
diff --git a/quic/core/qpack/qpack_decoded_headers_accumulator.cc b/quic/core/qpack/qpack_decoded_headers_accumulator.cc index 104309b..9a5af7e 100644 --- a/quic/core/qpack/qpack_decoded_headers_accumulator.cc +++ b/quic/core/qpack/qpack_decoded_headers_accumulator.cc
@@ -40,7 +40,11 @@ uncompressed_header_bytes_including_overhead_ += name.size() + value.size() + kQpackEntrySizeOverhead; - if (uncompressed_header_bytes_including_overhead_ > max_header_list_size_) { + const size_t uncompressed_header_bytes = + GetQuicFlag(FLAGS_quic_header_size_limit_includes_overhead) + ? uncompressed_header_bytes_including_overhead_ + : uncompressed_header_bytes_without_overhead_; + if (uncompressed_header_bytes > max_header_list_size_) { header_list_size_limit_exceeded_ = true; quic_header_list_.Clear(); } else {
diff --git a/quic/core/quic_protocol_flags_list.h b/quic/core/quic_protocol_flags_list.h index 287bf83..5187c61 100644 --- a/quic/core/quic_protocol_flags_list.h +++ b/quic/core/quic_protocol_flags_list.h
@@ -242,4 +242,11 @@ true, "If true, QUIC servers will defer sending in response to " "incoming packets by default.") + +QUIC_PROTOCOL_FLAG( + bool, + quic_header_size_limit_includes_overhead, + true, + "If true, QUIC QPACK decoder includes 32-bytes overheader per entry while " + "comparing request/response header size against its upper limit.") #endif