Add frame header and payload length argument to HttpDecoder::Visitor::OnHeadersFrameStart().

QuicSpdyStream, a HttpDecoder::Visitor implementation, needs to know the HEADERS
frame length in order to call SpdyStreamSequencer::MarkConsumed() when
appropriate.  This CL is chipped off of the draft CL at cr/231494986.

gfe-relnote: n/a.  Change in QUIC v99 only.
PiperOrigin-RevId: 238428175
Change-Id: Icff25fe34f04b96449cfcf4ed62f42e0b2e66c0f
diff --git a/quic/core/http/http_decoder.cc b/quic/core/http/http_decoder.cc
index 34e4342..7bccbbc 100644
--- a/quic/core/http/http_decoder.cc
+++ b/quic/core/http/http_decoder.cc
@@ -121,7 +121,9 @@
     }
     case 0x1: {  // HEADERS
       if (current_frame_length_ == remaining_frame_length_) {
-        visitor_->OnHeadersFrameStart();
+        visitor_->OnHeadersFrameStart(
+            Http3FrameLengths(current_length_field_size_ + kFrameTypeLength,
+                              current_frame_length_));
       }
       QuicByteCount bytes_to_read = std::min<QuicByteCount>(
           remaining_frame_length_, reader->BytesRemaining());
diff --git a/quic/core/http/http_decoder.h b/quic/core/http/http_decoder.h
index 47d97b6..cbfa65e 100644
--- a/quic/core/http/http_decoder.h
+++ b/quic/core/http/http_decoder.h
@@ -17,9 +17,9 @@
 
 class QuicDataReader;
 
-// Struct that stores meta data of a data frame.
-// |header_length| stores number of bytes header occupies.
-// |payload_length| stores number of bytes payload occupies.
+// Struct that stores meta data of an HTTP/3 frame.
+// |header_length| is frame header length in bytes.
+// |payload_length| is frame payload length in bytes.
 struct QUIC_EXPORT_PRIVATE Http3FrameLengths {
   Http3FrameLengths(QuicByteCount header, QuicByteCount payload)
       : header_length(header), payload_length(payload) {}
@@ -62,8 +62,8 @@
     // Called when a DUPLICATE_PUSH frame has been successfully parsed.
     virtual void OnDuplicatePushFrame(const DuplicatePushFrame& frame) = 0;
 
-    // Called when a DATA frame has been received, |frame_lengths| will be
-    // passed to inform header length and payload length of the frame.
+    // Called when a DATA frame has been received.
+    // |frame_length| contains DATA frame length and payload length.
     virtual void OnDataFrameStart(Http3FrameLengths frame_length) = 0;
     // Called when the payload of a DATA frame has read. May be called
     // multiple times for a single frame.
@@ -72,7 +72,8 @@
     virtual void OnDataFrameEnd() = 0;
 
     // Called when a HEADERS frame has been recevied.
-    virtual void OnHeadersFrameStart() = 0;
+    // |frame_length| contains HEADERS frame length and payload length.
+    virtual void OnHeadersFrameStart(Http3FrameLengths frame_length) = 0;
     // Called when the payload of a HEADERS frame has read. May be called
     // multiple times for a single frame.
     virtual void OnHeadersFramePayload(QuicStringPiece payload) = 0;
diff --git a/quic/core/http/http_decoder_test.cc b/quic/core/http/http_decoder_test.cc
index cfabe70..5e620cb 100644
--- a/quic/core/http/http_decoder_test.cc
+++ b/quic/core/http/http_decoder_test.cc
@@ -29,7 +29,7 @@
   MOCK_METHOD1(OnDataFramePayload, void(QuicStringPiece payload));
   MOCK_METHOD0(OnDataFrameEnd, void());
 
-  MOCK_METHOD0(OnHeadersFrameStart, void());
+  MOCK_METHOD1(OnHeadersFrameStart, void(Http3FrameLengths frame_lengths));
   MOCK_METHOD1(OnHeadersFramePayload, void(QuicStringPiece payload));
   MOCK_METHOD1(OnHeadersFrameEnd, void(QuicByteCount frame_len));
 
@@ -381,7 +381,7 @@
 
   // Process the full frame.
   InSequence s;
-  EXPECT_CALL(visitor_, OnHeadersFrameStart());
+  EXPECT_CALL(visitor_, OnHeadersFrameStart(Http3FrameLengths(2, 7)));
   EXPECT_CALL(visitor_, OnHeadersFramePayload(QuicStringPiece("Headers")));
   EXPECT_CALL(visitor_, OnHeadersFrameEnd(7));
   EXPECT_EQ(QUIC_ARRAYSIZE(input),
@@ -390,7 +390,7 @@
   EXPECT_EQ("", decoder_.error_detail());
 
   // Process the frame incremently.
-  EXPECT_CALL(visitor_, OnHeadersFrameStart());
+  EXPECT_CALL(visitor_, OnHeadersFrameStart(Http3FrameLengths(2, 7)));
   EXPECT_CALL(visitor_, OnHeadersFramePayload(QuicStringPiece("H")));
   EXPECT_CALL(visitor_, OnHeadersFramePayload(QuicStringPiece("e")));
   EXPECT_CALL(visitor_, OnHeadersFramePayload(QuicStringPiece("a")));
diff --git a/quic/core/http/quic_spdy_stream.cc b/quic/core/http/quic_spdy_stream.cc
index ce1370b..8a6f002 100644
--- a/quic/core/http/quic_spdy_stream.cc
+++ b/quic/core/http/quic_spdy_stream.cc
@@ -73,16 +73,31 @@
 
   void OnDataFrameEnd() override { stream_->OnDataFrameEnd(); }
 
-  void OnHeadersFrameStart() override {
-    CloseConnectionOnWrongFrame("Headers");
+  void OnHeadersFrameStart(Http3FrameLengths frame_length) override {
+    if (!VersionUsesQpack(
+            stream_->session()->connection()->transport_version())) {
+      CloseConnectionOnWrongFrame("Headers");
+      return;
+    }
+    stream_->OnHeadersFrameStart(frame_length);
   }
 
   void OnHeadersFramePayload(QuicStringPiece payload) override {
-    CloseConnectionOnWrongFrame("Headers");
+    if (!VersionUsesQpack(
+            stream_->session()->connection()->transport_version())) {
+      CloseConnectionOnWrongFrame("Headers");
+      return;
+    }
+    stream_->OnHeadersFramePayload(payload);
   }
 
   void OnHeadersFrameEnd(QuicByteCount frame_len) override {
-    CloseConnectionOnWrongFrame("Headers");
+    if (!VersionUsesQpack(
+            stream_->session()->connection()->transport_version())) {
+      CloseConnectionOnWrongFrame("Headers");
+      return;
+    }
+    stream_->OnHeadersFrameEnd(frame_len);
   }
 
   void OnPushPromiseFrameStart(PushId push_id) override {
@@ -625,5 +640,17 @@
   return header_acked_length;
 }
 
+void QuicSpdyStream::OnHeadersFrameStart(Http3FrameLengths frame_length) {
+  DCHECK(VersionUsesQpack(spdy_session_->connection()->transport_version()));
+}
+
+void QuicSpdyStream::OnHeadersFramePayload(QuicStringPiece payload) {
+  DCHECK(VersionUsesQpack(spdy_session_->connection()->transport_version()));
+}
+
+void QuicSpdyStream::OnHeadersFrameEnd(QuicByteCount frame_len) {
+  DCHECK(VersionUsesQpack(spdy_session_->connection()->transport_version()));
+}
+
 #undef ENDPOINT  // undef for jumbo builds
 }  // namespace quic
diff --git a/quic/core/http/quic_spdy_stream.h b/quic/core/http/quic_spdy_stream.h
index 726a282..c7fa26b 100644
--- a/quic/core/http/quic_spdy_stream.h
+++ b/quic/core/http/quic_spdy_stream.h
@@ -205,6 +205,9 @@
   void OnDataFrameStart(Http3FrameLengths frame_lengths);
   void OnDataFramePayload(QuicStringPiece payload);
   void OnDataFrameEnd();
+  void OnHeadersFrameStart(Http3FrameLengths frame_length);
+  void OnHeadersFramePayload(QuicStringPiece payload);
+  void OnHeadersFrameEnd(QuicByteCount frame_len);
 
   using QuicStream::CloseWriteSide;