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