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");
   }