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