Allow HttpDecoder to report metadata of SETTINGS frame to visitor.
gfe-relnote: new API, not used.
PiperOrigin-RevId: 241572090
Change-Id: Ibc83a3e99727317ba95f62060338a279195c5d89
diff --git a/quic/core/http/http_decoder.cc b/quic/core/http/http_decoder.cc
index 01d5e4b..972cb37 100644
--- a/quic/core/http/http_decoder.cc
+++ b/quic/core/http/http_decoder.cc
@@ -106,6 +106,9 @@
} else if (current_frame_type_ == 0x1) {
visitor_->OnHeadersFrameStart(Http3FrameLengths(
current_length_field_size_ + kFrameTypeLength, current_frame_length_));
+ } else if (current_frame_type_ == 0x4) {
+ visitor_->OnSettingsFrameStart(Http3FrameLengths(
+ current_length_field_size_ + kFrameTypeLength, current_frame_length_));
}
state_ = (remaining_frame_length_ == 0) ? STATE_FINISH_PARSING
diff --git a/quic/core/http/http_decoder.h b/quic/core/http/http_decoder.h
index 1cc973a..2318a03 100644
--- a/quic/core/http/http_decoder.h
+++ b/quic/core/http/http_decoder.h
@@ -56,6 +56,9 @@
// Called when a GOAWAY frame has been successfully parsed.
virtual void OnGoAwayFrame(const GoAwayFrame& frame) = 0;
+ // Called when a SETTINGS frame has been received.
+ virtual void OnSettingsFrameStart(Http3FrameLengths frame_length) = 0;
+
// Called when a SETTINGS frame has been successfully parsed.
virtual void OnSettingsFrame(const SettingsFrame& frame) = 0;
diff --git a/quic/core/http/http_decoder_test.cc b/quic/core/http/http_decoder_test.cc
index 53b5f86..a4202e1 100644
--- a/quic/core/http/http_decoder_test.cc
+++ b/quic/core/http/http_decoder_test.cc
@@ -22,6 +22,7 @@
MOCK_METHOD1(OnCancelPushFrame, void(const CancelPushFrame& frame));
MOCK_METHOD1(OnMaxPushIdFrame, void(const MaxPushIdFrame& frame));
MOCK_METHOD1(OnGoAwayFrame, void(const GoAwayFrame& frame));
+ MOCK_METHOD1(OnSettingsFrameStart, void(Http3FrameLengths frame_lengths));
MOCK_METHOD1(OnSettingsFrame, void(const SettingsFrame& frame));
MOCK_METHOD1(OnDuplicatePushFrame, void(const DuplicatePushFrame& frame));
@@ -271,6 +272,7 @@
frame.values[6] = 5;
// Process the full frame.
+ EXPECT_CALL(visitor_, OnSettingsFrameStart(Http3FrameLengths(2, 6)));
EXPECT_CALL(visitor_, OnSettingsFrame(frame));
EXPECT_EQ(QUIC_ARRAYSIZE(input),
decoder_.ProcessInput(input, QUIC_ARRAYSIZE(input)));
@@ -278,6 +280,7 @@
EXPECT_EQ("", decoder_.error_detail());
// Process the frame incremently.
+ EXPECT_CALL(visitor_, OnSettingsFrameStart(Http3FrameLengths(2, 6)));
EXPECT_CALL(visitor_, OnSettingsFrame(frame));
for (char c : input) {
EXPECT_EQ(1u, decoder_.ProcessInput(&c, 1));
diff --git a/quic/core/http/quic_spdy_stream.cc b/quic/core/http/quic_spdy_stream.cc
index 6d15292..221a4dd 100644
--- a/quic/core/http/quic_spdy_stream.cc
+++ b/quic/core/http/quic_spdy_stream.cc
@@ -55,6 +55,10 @@
CloseConnectionOnWrongFrame("Goaway");
}
+ void OnSettingsFrameStart(Http3FrameLengths frame_lengths) override {
+ CloseConnectionOnWrongFrame("Settings");
+ }
+
void OnSettingsFrame(const SettingsFrame& frame) override {
CloseConnectionOnWrongFrame("Settings");
}