Plumbs GetCurrentHeaderTableSize() through spdy::HpackDecoderAdapter and http2::HpackDecoderState.

PiperOrigin-RevId: 397325935
diff --git a/http2/hpack/decoder/hpack_decoder.h b/http2/hpack/decoder/hpack_decoder.h
index 9217707..3ac5819 100644
--- a/http2/hpack/decoder/hpack_decoder.h
+++ b/http2/hpack/decoder/hpack_decoder.h
@@ -69,6 +69,11 @@
   // decoding the SETTINGS ACK, and before the next HPACK block is decoded.
   void ApplyHeaderTableSizeSetting(uint32_t max_header_table_size);
 
+  // Returns the most recently applied value of SETTINGS_HEADER_TABLE_SIZE.
+  size_t GetCurrentHeaderTableSizeSetting() const {
+    return decoder_state_.GetCurrentHeaderTableSizeSetting();
+  }
+
   // Prepares the decoder for decoding a new HPACK block, and announces this to
   // its listener. Returns true if OK to continue with decoding, false if an
   // error has been detected, which for StartDecodingBlock means the error was
diff --git a/http2/hpack/decoder/hpack_decoder_state.h b/http2/hpack/decoder/hpack_decoder_state.h
index 5dcdc40..3040c18 100644
--- a/http2/hpack/decoder/hpack_decoder_state.h
+++ b/http2/hpack/decoder/hpack_decoder_state.h
@@ -57,6 +57,11 @@
   // decoding the SETTINGS ACK, and before the next HPACK block is decoded.
   void ApplyHeaderTableSizeSetting(uint32_t max_header_table_size);
 
+  // Returns the most recently applied value of SETTINGS_HEADER_TABLE_SIZE.
+  size_t GetCurrentHeaderTableSizeSetting() const {
+    return final_header_table_size_;
+  }
+
   // OnHeaderBlockStart notifies this object that we're starting to decode the
   // HPACK payload of a HEADERS or PUSH_PROMISE frame.
   void OnHeaderBlockStart();
diff --git a/http2/hpack/decoder/hpack_decoder_state_test.cc b/http2/hpack/decoder/hpack_decoder_state_test.cc
index 698c655..7e36a17 100644
--- a/http2/hpack/decoder/hpack_decoder_state_test.cc
+++ b/http2/hpack/decoder/hpack_decoder_state_test.cc
@@ -427,8 +427,10 @@
 
 // Confirm that required size updates are indeed required before headers.
 TEST_F(HpackDecoderStateTest, RequiredTableSizeChangeBeforeHeader) {
+  EXPECT_EQ(4096u, decoder_state_.GetCurrentHeaderTableSizeSetting());
   decoder_state_.ApplyHeaderTableSizeSetting(1024);
   decoder_state_.ApplyHeaderTableSizeSetting(2048);
+  EXPECT_EQ(2048u, decoder_state_.GetCurrentHeaderTableSizeSetting());
 
   // First provide the required update, and an allowed second update.
   SendStartAndVerifyCallback();
@@ -442,6 +444,7 @@
 
   // Another HPACK block, but this time missing the required size update.
   decoder_state_.ApplyHeaderTableSizeSetting(1024);
+  EXPECT_EQ(1024u, decoder_state_.GetCurrentHeaderTableSizeSetting());
   SendStartAndVerifyCallback();
   EXPECT_CALL(listener_,
               OnHeaderErrorDetected(Eq("Missing dynamic table size update")));
diff --git a/http2/hpack/decoder/hpack_decoder_test.cc b/http2/hpack/decoder/hpack_decoder_test.cc
index ce44ccb..c160bfe 100644
--- a/http2/hpack/decoder/hpack_decoder_test.cc
+++ b/http2/hpack/decoder/hpack_decoder_test.cc
@@ -961,11 +961,13 @@
 
 // Confirm that the table size can be changed when required, but at most twice.
 TEST_P(HpackDecoderTest, ProcessesRequiredTableSizeUpdate) {
+  EXPECT_EQ(4096u, decoder_.GetCurrentHeaderTableSizeSetting());
   // One update required, two allowed, one provided, followed by a header.
   decoder_.ApplyHeaderTableSizeSetting(1024);
   decoder_.ApplyHeaderTableSizeSetting(2048);
   EXPECT_EQ(Http2SettingsInfo::DefaultHeaderTableSize(),
             header_table_size_limit());
+  EXPECT_EQ(2048u, decoder_.GetCurrentHeaderTableSizeSetting());
   {
     HpackBlockBuilder hbb;
     hbb.AppendDynamicTableSizeUpdate(1024);
@@ -979,6 +981,7 @@
   // One update required, two allowed, two provided, followed by a header.
   decoder_.ApplyHeaderTableSizeSetting(1000);
   decoder_.ApplyHeaderTableSizeSetting(1500);
+  EXPECT_EQ(1500u, decoder_.GetCurrentHeaderTableSizeSetting());
   {
     HpackBlockBuilder hbb;
     hbb.AppendDynamicTableSizeUpdate(500);
@@ -994,6 +997,7 @@
   // The third update is rejected, so the final size is 1000, not 500.
   decoder_.ApplyHeaderTableSizeSetting(500);
   decoder_.ApplyHeaderTableSizeSetting(1000);
+  EXPECT_EQ(1000u, decoder_.GetCurrentHeaderTableSizeSetting());
   {
     HpackBlockBuilder hbb;
     hbb.AppendDynamicTableSizeUpdate(200);
@@ -1011,6 +1015,7 @@
     EXPECT_EQ(0u, current_header_table_size());
     EXPECT_TRUE(header_entries_.empty());
   }
+  EXPECT_EQ(1000u, decoder_.GetCurrentHeaderTableSizeSetting());
   // Now that an error has been detected, StartDecodingBlock should return
   // false.
   EXPECT_FALSE(decoder_.StartDecodingBlock());
diff --git a/spdy/core/hpack/hpack_decoder_adapter.cc b/spdy/core/hpack/hpack_decoder_adapter.cc
index 64a21d8..aaee600 100644
--- a/spdy/core/hpack/hpack_decoder_adapter.cc
+++ b/spdy/core/hpack/hpack_decoder_adapter.cc
@@ -29,6 +29,10 @@
   hpack_decoder_.ApplyHeaderTableSizeSetting(size_setting);
 }
 
+size_t HpackDecoderAdapter::GetCurrentHeaderTableSizeSetting() const {
+  return hpack_decoder_.GetCurrentHeaderTableSizeSetting();
+}
+
 void HpackDecoderAdapter::HandleControlFrameHeadersStart(
     SpdyHeadersHandlerInterface* handler) {
   QUICHE_DVLOG(2) << "HpackDecoderAdapter::HandleControlFrameHeadersStart";
diff --git a/spdy/core/hpack/hpack_decoder_adapter.h b/spdy/core/hpack/hpack_decoder_adapter.h
index a4fc56a..c4bc991 100644
--- a/spdy/core/hpack/hpack_decoder_adapter.h
+++ b/spdy/core/hpack/hpack_decoder_adapter.h
@@ -39,6 +39,9 @@
   // Called upon acknowledgement of SETTINGS_HEADER_TABLE_SIZE.
   void ApplyHeaderTableSizeSetting(size_t size_setting);
 
+  // Returns the most recently applied value of SETTINGS_HEADER_TABLE_SIZE.
+  size_t GetCurrentHeaderTableSizeSetting() const;
+
   // If a SpdyHeadersHandlerInterface is provided, the decoder will emit
   // headers to it rather than accumulating them in a SpdyHeaderBlock.
   // Does not take ownership of the handler, but does use the pointer until
diff --git a/spdy/core/hpack/hpack_decoder_adapter_test.cc b/spdy/core/hpack/hpack_decoder_adapter_test.cc
index 53e4939..f1f64e6 100644
--- a/spdy/core/hpack/hpack_decoder_adapter_test.cc
+++ b/spdy/core/hpack/hpack_decoder_adapter_test.cc
@@ -267,6 +267,12 @@
     ::testing::Combine(::testing::Values(START_WITH_HANDLER),
                        ::testing::Bool()));
 
+TEST_P(HpackDecoderAdapterTest, ApplyHeaderTableSizeSetting) {
+  EXPECT_EQ(4096u, decoder_.GetCurrentHeaderTableSizeSetting());
+  decoder_.ApplyHeaderTableSizeSetting(12 * 1024);
+  EXPECT_EQ(12288u, decoder_.GetCurrentHeaderTableSizeSetting());
+}
+
 TEST_P(HpackDecoderAdapterTest,
        AddHeaderDataWithHandleControlFrameHeadersData) {
   // The hpack decode buffer size is limited in size. This test verifies that