Add `payload_length` argument to SpdyFramerVisitorInterface::OnHeaders().

Also add some comments to analogous
SpdyFramerVisitorInterface::OnDataFrameHeader(), which also has a length field.

The goal is to use the new `payload_length` argument in recording the header
bytes for Dapper annotations.

PiperOrigin-RevId: 449842231
diff --git a/quiche/http2/adapter/event_forwarder.cc b/quiche/http2/adapter/event_forwarder.cc
index b5c0389..a18a2cd 100644
--- a/quiche/http2/adapter/event_forwarder.cc
+++ b/quiche/http2/adapter/event_forwarder.cc
@@ -116,12 +116,13 @@
   return false;
 }
 
-void EventForwarder::OnHeaders(spdy::SpdyStreamId stream_id, bool has_priority,
+void EventForwarder::OnHeaders(spdy::SpdyStreamId stream_id,
+                               size_t payload_length, bool has_priority,
                                int weight, spdy::SpdyStreamId parent_stream_id,
                                bool exclusive, bool fin, bool end) {
   if (can_forward_()) {
-    receiver_.OnHeaders(stream_id, has_priority, weight, parent_stream_id,
-                        exclusive, fin, end);
+    receiver_.OnHeaders(stream_id, payload_length, has_priority, weight,
+                        parent_stream_id, exclusive, fin, end);
   }
 }
 
diff --git a/quiche/http2/adapter/event_forwarder.h b/quiche/http2/adapter/event_forwarder.h
index 1682263..5f93db0 100644
--- a/quiche/http2/adapter/event_forwarder.h
+++ b/quiche/http2/adapter/event_forwarder.h
@@ -46,7 +46,8 @@
   void OnGoAway(spdy::SpdyStreamId last_accepted_stream_id,
                 spdy::SpdyErrorCode error_code) override;
   bool OnGoAwayFrameData(const char* goaway_data, size_t len) override;
-  void OnHeaders(spdy::SpdyStreamId stream_id, bool has_priority, int weight,
+  void OnHeaders(spdy::SpdyStreamId stream_id, size_t payload_length,
+                 bool has_priority, int weight,
                  spdy::SpdyStreamId parent_stream_id, bool exclusive, bool fin,
                  bool end) override;
   void OnWindowUpdate(spdy::SpdyStreamId stream_id,
diff --git a/quiche/http2/adapter/event_forwarder_test.cc b/quiche/http2/adapter/event_forwarder_test.cc
index eab6516..c3680c8 100644
--- a/quiche/http2/adapter/event_forwarder_test.cc
+++ b/quiche/http2/adapter/event_forwarder_test.cc
@@ -89,11 +89,12 @@
   EXPECT_CALL(receiver, OnGoAwayFrameData(some_data.data(), some_data.size()));
   event_forwarder.OnGoAwayFrameData(some_data.data(), some_data.size());
 
-  EXPECT_CALL(
-      receiver,
-      OnHeaders(stream_id, /*has_priority=*/false, /*weight=*/42, stream_id + 2,
-                /*exclusive=*/false, /*fin=*/true, /*end=*/true));
-  event_forwarder.OnHeaders(stream_id, /*has_priority=*/false, /*weight=*/42,
+  EXPECT_CALL(receiver,
+              OnHeaders(stream_id, /*payload_length=*/1234,
+                        /*has_priority=*/false, /*weight=*/42, stream_id + 2,
+                        /*exclusive=*/false, /*fin=*/true, /*end=*/true));
+  event_forwarder.OnHeaders(stream_id, /*payload_length=*/1234,
+                            /*has_priority=*/false, /*weight=*/42,
                             stream_id + 2, /*exclusive=*/false, /*fin=*/true,
                             /*end=*/true);
 
@@ -186,7 +187,8 @@
   event_forwarder.OnGoAwayFrameData(some_data.data(), some_data.size());
 
   EXPECT_CALL(receiver, OnHeaders).Times(0);
-  event_forwarder.OnHeaders(stream_id, /*has_priority=*/false, /*weight=*/42,
+  event_forwarder.OnHeaders(stream_id, /*payload_length=*/1234,
+                            /*has_priority=*/false, /*weight=*/42,
                             stream_id + 2, /*exclusive=*/false, /*fin=*/true,
                             /*end=*/true);
 
diff --git a/quiche/http2/adapter/oghttp2_session.cc b/quiche/http2/adapter/oghttp2_session.cc
index c27cee2..77fff36 100644
--- a/quiche/http2/adapter/oghttp2_session.cc
+++ b/quiche/http2/adapter/oghttp2_session.cc
@@ -1338,7 +1338,8 @@
 }
 
 void OgHttp2Session::OnHeaders(spdy::SpdyStreamId stream_id,
-                               bool /*has_priority*/, int /*weight*/,
+                               size_t /*payload_length*/, bool /*has_priority*/,
+                               int /*weight*/,
                                spdy::SpdyStreamId /*parent_stream_id*/,
                                bool /*exclusive*/, bool fin, bool /*end*/) {
   if (stream_id % 2 == 0) {
diff --git a/quiche/http2/adapter/oghttp2_session.h b/quiche/http2/adapter/oghttp2_session.h
index 458d0da..5bc854b 100644
--- a/quiche/http2/adapter/oghttp2_session.h
+++ b/quiche/http2/adapter/oghttp2_session.h
@@ -180,7 +180,8 @@
   void OnGoAway(spdy::SpdyStreamId last_accepted_stream_id,
                 spdy::SpdyErrorCode error_code) override;
   bool OnGoAwayFrameData(const char* goaway_data, size_t len) override;
-  void OnHeaders(spdy::SpdyStreamId stream_id, bool has_priority, int weight,
+  void OnHeaders(spdy::SpdyStreamId stream_id, size_t payload_length,
+                 bool has_priority, int weight,
                  spdy::SpdyStreamId parent_stream_id, bool exclusive, bool fin,
                  bool end) override;
   void OnWindowUpdate(spdy::SpdyStreamId stream_id,
diff --git a/quiche/http2/core/http2_trace_logging.cc b/quiche/http2/core/http2_trace_logging.cc
index f6eef16..10ff163 100644
--- a/quiche/http2/core/http2_trace_logging.cc
+++ b/quiche/http2/core/http2_trace_logging.cc
@@ -257,16 +257,17 @@
   return wrapped_->OnGoAwayFrameData(goaway_data, len);
 }
 
-void Http2TraceLogger::OnHeaders(SpdyStreamId stream_id, bool has_priority,
-                                 int weight, SpdyStreamId parent_stream_id,
-                                 bool exclusive, bool fin, bool end) {
+void Http2TraceLogger::OnHeaders(SpdyStreamId stream_id, size_t payload_length,
+                                 bool has_priority, int weight,
+                                 SpdyStreamId parent_stream_id, bool exclusive,
+                                 bool fin, bool end) {
   HTTP2_TRACE_LOG(perspective_, is_enabled_)
       << "OnHeaders:" << FORMAT_ARG(connection_id_) << FORMAT_ARG(stream_id)
-      << FORMAT_ARG(has_priority) << FORMAT_INT_ARG(weight)
-      << FORMAT_ARG(parent_stream_id) << FORMAT_ARG(exclusive)
-      << FORMAT_ARG(fin) << FORMAT_ARG(end);
-  wrapped_->OnHeaders(stream_id, has_priority, weight, parent_stream_id,
-                      exclusive, fin, end);
+      << FORMAT_ARG(payload_length) << FORMAT_ARG(has_priority)
+      << FORMAT_INT_ARG(weight) << FORMAT_ARG(parent_stream_id)
+      << FORMAT_ARG(exclusive) << FORMAT_ARG(fin) << FORMAT_ARG(end);
+  wrapped_->OnHeaders(stream_id, payload_length, has_priority, weight,
+                      parent_stream_id, exclusive, fin, end);
 }
 
 void Http2TraceLogger::OnWindowUpdate(SpdyStreamId stream_id,
diff --git a/quiche/http2/core/http2_trace_logging.h b/quiche/http2/core/http2_trace_logging.h
index 6f982dc..1bde7ee 100644
--- a/quiche/http2/core/http2_trace_logging.h
+++ b/quiche/http2/core/http2_trace_logging.h
@@ -71,9 +71,9 @@
   void OnGoAway(SpdyStreamId last_accepted_stream_id,
                 SpdyErrorCode error_code) override;
   bool OnGoAwayFrameData(const char* goaway_data, size_t len) override;
-  void OnHeaders(SpdyStreamId stream_id, bool has_priority, int weight,
-                 SpdyStreamId parent_stream_id, bool exclusive, bool fin,
-                 bool end) override;
+  void OnHeaders(SpdyStreamId stream_id, size_t payload_length,
+                 bool has_priority, int weight, SpdyStreamId parent_stream_id,
+                 bool exclusive, bool fin, bool end) override;
   void OnWindowUpdate(SpdyStreamId stream_id, int delta_window_size) override;
   void OnPushPromise(SpdyStreamId stream_id, SpdyStreamId promised_stream_id,
                      bool end) override;
diff --git a/quiche/quic/core/http/quic_headers_stream_test.cc b/quiche/quic/core/http/quic_headers_stream_test.cc
index f82a0dd..9b8ffb4 100644
--- a/quiche/quic/core/http/quic_headers_stream_test.cc
+++ b/quiche/quic/core/http/quic_headers_stream_test.cc
@@ -101,9 +101,9 @@
               (SpdyStreamId last_accepted_stream_id, SpdyErrorCode error_code),
               (override));
   MOCK_METHOD(void, OnHeaders,
-              (SpdyStreamId stream_id, bool has_priority, int weight,
-               SpdyStreamId parent_stream_id, bool exclusive, bool fin,
-               bool end),
+              (SpdyStreamId stream_id, size_t payload_length, bool has_priority,
+               int weight, SpdyStreamId parent_stream_id, bool exclusive,
+               bool fin, bool end),
               (override));
   MOCK_METHOD(void, OnWindowUpdate,
               (SpdyStreamId stream_id, int delta_window_size), (override));
@@ -281,17 +281,20 @@
 
     // Parse the outgoing data and check that it matches was was written.
     if (is_request) {
-      EXPECT_CALL(visitor_,
-                  OnHeaders(stream_id, kHasPriority,
-                            Spdy3PriorityToHttp2Weight(priority),
-                            /*parent_stream_id=*/0,
-                            /*exclusive=*/false, fin, kFrameComplete));
+      EXPECT_CALL(
+          visitor_,
+          OnHeaders(stream_id, saved_data_.length() - spdy::kFrameHeaderSize,
+                    kHasPriority, Spdy3PriorityToHttp2Weight(priority),
+                    /*parent_stream_id=*/0,
+                    /*exclusive=*/false, fin, kFrameComplete));
     } else {
-      EXPECT_CALL(visitor_,
-                  OnHeaders(stream_id, !kHasPriority,
-                            /*weight=*/0,
-                            /*parent_stream_id=*/0,
-                            /*exclusive=*/false, fin, kFrameComplete));
+      EXPECT_CALL(
+          visitor_,
+          OnHeaders(stream_id, saved_data_.length() - spdy::kFrameHeaderSize,
+                    !kHasPriority,
+                    /*weight=*/0,
+                    /*parent_stream_id=*/0,
+                    /*exclusive=*/false, fin, kFrameComplete));
     }
     headers_handler_ = std::make_unique<RecordingHeadersHandler>();
     EXPECT_CALL(visitor_, OnHeaderFrameStart(stream_id))
diff --git a/quiche/quic/core/http/quic_spdy_session.cc b/quiche/quic/core/http/quic_spdy_session.cc
index af40f36..f0aa6d5 100644
--- a/quiche/quic/core/http/quic_spdy_session.cc
+++ b/quiche/quic/core/http/quic_spdy_session.cc
@@ -318,8 +318,9 @@
                     QUIC_INVALID_HEADERS_STREAM_DATA);
   }
 
-  void OnHeaders(SpdyStreamId stream_id, bool has_priority, int weight,
-                 SpdyStreamId /* parent_stream_id */, bool /* exclusive */,
+  void OnHeaders(SpdyStreamId stream_id, size_t /*payload_length*/,
+                 bool has_priority, int weight,
+                 SpdyStreamId /*parent_stream_id*/, bool /*exclusive*/,
                  bool fin, bool /*end*/) override {
     if (!session_->IsConnected()) {
       return;
diff --git a/quiche/spdy/core/http2_frame_decoder_adapter.cc b/quiche/spdy/core/http2_frame_decoder_adapter.cc
index c783a5d..780342e 100644
--- a/quiche/spdy/core/http2_frame_decoder_adapter.cc
+++ b/quiche/spdy/core/http2_frame_decoder_adapter.cc
@@ -436,7 +436,8 @@
     }
     on_headers_called_ = true;
     ReportReceiveCompressedFrame(header);
-    visitor()->OnHeaders(header.stream_id, kNotHasPriorityFields,
+    visitor()->OnHeaders(header.stream_id, header.payload_length,
+                         kNotHasPriorityFields,
                          0,      // priority
                          0,      // parent_stream_id
                          false,  // exclusive
@@ -460,10 +461,10 @@
         << " priority:" << priority << " frame_header:" << frame_header_;
     return;
   }
-  visitor()->OnHeaders(frame_header_.stream_id, kHasPriorityFields,
-                       priority.weight, priority.stream_dependency,
-                       priority.is_exclusive, frame_header_.IsEndStream(),
-                       frame_header_.IsEndHeaders());
+  visitor()->OnHeaders(
+      frame_header_.stream_id, frame_header_.payload_length, kHasPriorityFields,
+      priority.weight, priority.stream_dependency, priority.is_exclusive,
+      frame_header_.IsEndStream(), frame_header_.IsEndHeaders());
   CommonStartHpackBlock();
 }
 
diff --git a/quiche/spdy/core/http2_frame_decoder_adapter.h b/quiche/spdy/core/http2_frame_decoder_adapter.h
index cc71433..fbdfd5b 100644
--- a/quiche/spdy/core/http2_frame_decoder_adapter.h
+++ b/quiche/spdy/core/http2_frame_decoder_adapter.h
@@ -376,9 +376,12 @@
   virtual void OnCommonHeader(SpdyStreamId /*stream_id*/, size_t /*length*/,
                               uint8_t /*type*/, uint8_t /*flags*/) {}
 
-  // Called when a data frame header is received. The frame's data
-  // payload will be provided via subsequent calls to
-  // OnStreamFrameData().
+  // Called when a data frame header is received. The frame's data payload will
+  // be provided via subsequent calls to OnStreamFrameData().
+  // |stream_id| The stream receiving data.
+  // |length| The length of the payload in this DATA frame. Includes the length
+  //     of the data itself and potential padding.
+  // |fin| Whether the END_STREAM flag is set in the frame header.
   virtual void OnDataFrameHeader(SpdyStreamId stream_id, size_t length,
                                  bool fin) = 0;
 
@@ -444,6 +447,8 @@
   // Called when a HEADERS frame is received.
   // Note that header block data is not included. See OnHeaderFrameStart().
   // |stream_id| The stream receiving the header.
+  // |payload_length| The length of the payload in this HEADERS frame. Includes
+  //     the length of the encoded header block and potential padding.
   // |has_priority| Whether or not the headers frame included a priority value,
   //     and stream dependency info.
   // |weight| If |has_priority| is true, then weight (in the range [1, 256])
@@ -452,10 +457,11 @@
   //     receiving stream, else 0.
   // |exclusive| If |has_priority| is true the exclusivity of dependence on the
   //     parent stream, else false.
-  // |fin| Whether FIN flag is set in frame headers.
+  // |fin| Whether the END_STREAM flag is set in the frame header.
   // |end| False if HEADERs frame is to be followed by a CONTINUATION frame,
   //     or true if not.
-  virtual void OnHeaders(SpdyStreamId stream_id, bool has_priority, int weight,
+  virtual void OnHeaders(SpdyStreamId stream_id, size_t payload_length,
+                         bool has_priority, int weight,
                          SpdyStreamId parent_stream_id, bool exclusive,
                          bool fin, bool end) = 0;
 
diff --git a/quiche/spdy/core/spdy_framer_test.cc b/quiche/spdy/core/spdy_framer_test.cc
index bdea70c..1b3c421 100644
--- a/quiche/spdy/core/spdy_framer_test.cc
+++ b/quiche/spdy/core/spdy_framer_test.cc
@@ -353,12 +353,13 @@
     ++goaway_count_;
   }
 
-  void OnHeaders(SpdyStreamId stream_id, bool has_priority, int weight,
-                 SpdyStreamId parent_stream_id, bool exclusive, bool fin,
-                 bool end) override {
-    QUICHE_VLOG(1) << "OnHeaders(" << stream_id << ", " << has_priority << ", "
-                   << weight << ", " << parent_stream_id << ", " << exclusive
-                   << ", " << fin << ", " << end << ")";
+  void OnHeaders(SpdyStreamId stream_id, size_t payload_length,
+                 bool has_priority, int weight, SpdyStreamId parent_stream_id,
+                 bool exclusive, bool fin, bool end) override {
+    QUICHE_VLOG(1) << "OnHeaders(" << stream_id << ", " << payload_length
+                   << ", " << has_priority << ", " << weight << ", "
+                   << parent_stream_id << ", " << exclusive << ", " << fin
+                   << ", " << end << ")";
     ++headers_frame_count_;
     InitHeaderStreaming(SpdyFrameType::HEADERS, stream_id);
     if (fin) {
@@ -852,7 +853,7 @@
                             sizeof(kH2FrameData), false);
 
   EXPECT_CALL(visitor, OnCommonHeader(1, 5, 0x1, 0x8));
-  EXPECT_CALL(visitor, OnHeaders(1, false, 0, 0, false, false, false));
+  EXPECT_CALL(visitor, OnHeaders(1, 5, false, 0, 0, false, false, false));
   EXPECT_CALL(visitor, OnHeaderFrameStart(1)).Times(1);
   EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_PADDING, _));
   EXPECT_EQ(frame.size(), deframer_->ProcessInput(frame.data(), frame.size()));
@@ -883,7 +884,7 @@
   SpdySerializedFrame frame(kH2FrameData, sizeof(kH2FrameData), false);
 
   EXPECT_CALL(visitor, OnCommonHeader(1, 5, 0x1, 0x8));
-  EXPECT_CALL(visitor, OnHeaders(1, false, 0, 0, false, false, false));
+  EXPECT_CALL(visitor, OnHeaders(1, 5, false, 0, 0, false, false, false));
   EXPECT_CALL(visitor, OnHeaderFrameStart(1)).Times(1);
 
   EXPECT_EQ(frame.size(), deframer_->ProcessInput(frame.data(), frame.size()));
@@ -1316,14 +1317,14 @@
 
   testing::InSequence s;
   EXPECT_CALL(visitor, OnCommonHeader(1, 1, 0x1, 0x4));
-  EXPECT_CALL(visitor, OnHeaders(1, false, 0, 0, false, false, true));
+  EXPECT_CALL(visitor, OnHeaders(1, 1, false, 0, 0, false, false, true));
   EXPECT_CALL(visitor, OnHeaderFrameStart(1));
   EXPECT_CALL(visitor, OnHeaderFrameEnd(1));
   EXPECT_CALL(visitor, OnCommonHeader(1, 12, 0x0, 0x0));
   EXPECT_CALL(visitor, OnDataFrameHeader(1, 12, false));
   EXPECT_CALL(visitor, OnStreamFrameData(1, _, 12));
   EXPECT_CALL(visitor, OnCommonHeader(3, 6, 0x1, 0x24));
-  EXPECT_CALL(visitor, OnHeaders(3, true, 131, 0, false, false, true));
+  EXPECT_CALL(visitor, OnHeaders(3, 6, true, 131, 0, false, false, true));
   EXPECT_CALL(visitor, OnHeaderFrameStart(3));
   EXPECT_CALL(visitor, OnHeaderFrameEnd(3));
   EXPECT_CALL(visitor, OnCommonHeader(3, 8, 0x0, 0x0));
@@ -4196,7 +4197,7 @@
       exclusive = true;
     }
     EXPECT_CALL(visitor, OnCommonHeader(stream_id, _, 0x1, set_flags));
-    EXPECT_CALL(visitor, OnHeaders(stream_id, has_priority, weight,
+    EXPECT_CALL(visitor, OnHeaders(stream_id, _, has_priority, weight,
                                    parent_stream_id, exclusive, fin, end));
     EXPECT_CALL(visitor, OnHeaderFrameStart(57)).Times(1);
     if (end) {
@@ -4338,7 +4339,7 @@
     EXPECT_CALL(debug_visitor,
                 OnReceiveCompressedFrame(42, SpdyFrameType::HEADERS, _));
     EXPECT_CALL(visitor, OnCommonHeader(42, _, 0x1, 0));
-    EXPECT_CALL(visitor, OnHeaders(42, false, 0, 0, false, false, false));
+    EXPECT_CALL(visitor, OnHeaders(42, _, false, 0, 0, false, false, false));
     EXPECT_CALL(visitor, OnHeaderFrameStart(42)).Times(1);
 
     SpdyHeadersIR headers_ir(/* stream_id = */ 42);
diff --git a/quiche/spdy/core/spdy_no_op_visitor.h b/quiche/spdy/core/spdy_no_op_visitor.h
index b0fa009..3bb47be 100644
--- a/quiche/spdy/core/spdy_no_op_visitor.h
+++ b/quiche/spdy/core/spdy_no_op_visitor.h
@@ -46,9 +46,10 @@
   void OnSettingsAck() override {}
   void OnGoAway(SpdyStreamId /*last_accepted_stream_id*/,
                 SpdyErrorCode /*error_code*/) override {}
-  void OnHeaders(SpdyStreamId /*stream_id*/, bool /*has_priority*/,
-                 int /*weight*/, SpdyStreamId /*parent_stream_id*/,
-                 bool /*exclusive*/, bool /*fin*/, bool /*end*/) override {}
+  void OnHeaders(SpdyStreamId /*stream_id*/, size_t /*payload_length*/,
+                 bool /*has_priority*/, int /*weight*/,
+                 SpdyStreamId /*parent_stream_id*/, bool /*exclusive*/,
+                 bool /*fin*/, bool /*end*/) override {}
   void OnWindowUpdate(SpdyStreamId /*stream_id*/,
                       int /*delta_window_size*/) override {}
   void OnPushPromise(SpdyStreamId /*stream_id*/,
diff --git a/quiche/spdy/test_tools/mock_spdy_framer_visitor.h b/quiche/spdy/test_tools/mock_spdy_framer_visitor.h
index 3575d67..5d721c6 100644
--- a/quiche/spdy/test_tools/mock_spdy_framer_visitor.h
+++ b/quiche/spdy/test_tools/mock_spdy_framer_visitor.h
@@ -59,9 +59,9 @@
   MOCK_METHOD(bool, OnGoAwayFrameData, (const char* goaway_data, size_t len),
               (override));
   MOCK_METHOD(void, OnHeaders,
-              (SpdyStreamId stream_id, bool has_priority, int weight,
-               SpdyStreamId parent_stream_id, bool exclusive, bool fin,
-               bool end),
+              (SpdyStreamId stream_id, size_t payload_length, bool has_priority,
+               int weight, SpdyStreamId parent_stream_id, bool exclusive,
+               bool fin, bool end),
               (override));
   MOCK_METHOD(void, OnWindowUpdate,
               (SpdyStreamId stream_id, int delta_window_size), (override));