Pass payload length or compressed header block length to some HttpDecoder::Visitor methods.

gfe-relnote: n/a, no functional change.
PiperOrigin-RevId: 303422942
Change-Id: I42bad990876ca47ca8038d5b4745748a76e32c3e
diff --git a/quic/core/http/http_decoder.cc b/quic/core/http/http_decoder.cc
index 4e3734a..c1fa96c 100644
--- a/quic/core/http/http_decoder.cc
+++ b/quic/core/http/http_decoder.cc
@@ -140,10 +140,12 @@
 
   switch (current_frame_type_) {
     case static_cast<uint64_t>(HttpFrameType::DATA):
-      continue_processing = visitor_->OnDataFrameStart(header_length);
+      continue_processing =
+          visitor_->OnDataFrameStart(header_length, current_frame_length_);
       break;
     case static_cast<uint64_t>(HttpFrameType::HEADERS):
-      continue_processing = visitor_->OnHeadersFrameStart(header_length);
+      continue_processing =
+          visitor_->OnHeadersFrameStart(header_length, current_frame_length_);
       break;
     case static_cast<uint64_t>(HttpFrameType::CANCEL_PUSH):
       break;
@@ -168,8 +170,8 @@
       continue_processing = visitor_->OnPriorityUpdateFrameStart(header_length);
       break;
     default:
-      continue_processing =
-          visitor_->OnUnknownFrameStart(current_frame_type_, header_length);
+      continue_processing = visitor_->OnUnknownFrameStart(
+          current_frame_type_, header_length, current_frame_length_);
       break;
   }
 
@@ -237,8 +239,9 @@
         bool success = reader->ReadVarInt62(&push_id);
         DCHECK(success);
         remaining_frame_length_ -= current_push_id_length_;
-        if (!visitor_->OnPushPromiseFramePushId(push_id,
-                                                current_push_id_length_)) {
+        if (!visitor_->OnPushPromiseFramePushId(
+                push_id, current_push_id_length_,
+                current_frame_length_ - current_push_id_length_)) {
           continue_processing = false;
           current_push_id_length_ = 0;
           break;
@@ -255,8 +258,9 @@
 
         bool success = push_id_reader.ReadVarInt62(&push_id);
         DCHECK(success);
-        if (!visitor_->OnPushPromiseFramePushId(push_id,
-                                                current_push_id_length_)) {
+        if (!visitor_->OnPushPromiseFramePushId(
+                push_id, current_push_id_length_,
+                current_frame_length_ - current_push_id_length_)) {
           continue_processing = false;
           current_push_id_length_ = 0;
           break;
diff --git a/quic/core/http/http_decoder.h b/quic/core/http/http_decoder.h
index 2558805..3650bef 100644
--- a/quic/core/http/http_decoder.h
+++ b/quic/core/http/http_decoder.h
@@ -55,8 +55,10 @@
     virtual bool OnSettingsFrame(const SettingsFrame& frame) = 0;
 
     // Called when a DATA frame has been received.
-    // |header_length| contains DATA frame length and payload length.
-    virtual bool OnDataFrameStart(QuicByteCount header_length) = 0;
+    // |header_length| and |payload_length| are the length of DATA frame header
+    // and payload, respectively.
+    virtual bool OnDataFrameStart(QuicByteCount header_length,
+                                  QuicByteCount payload_length) = 0;
     // Called when part of the payload of a DATA frame has been read.  May be
     // called multiple times for a single frame.  |payload| is guaranteed to be
     // non-empty.
@@ -65,22 +67,27 @@
     virtual bool OnDataFrameEnd() = 0;
 
     // Called when a HEADERS frame has been received.
-    // |header_length| contains HEADERS frame length and payload length.
-    virtual bool OnHeadersFrameStart(QuicByteCount header_length) = 0;
+    // |header_length| and |payload_length| are the length of HEADERS frame
+    // header and payload, respectively.
+    virtual bool OnHeadersFrameStart(QuicByteCount header_length,
+                                     QuicByteCount payload_length) = 0;
     // Called when part of the payload of a HEADERS frame has been read.  May be
     // called multiple times for a single frame.  |payload| is guaranteed to be
     // non-empty.
     virtual bool OnHeadersFramePayload(quiche::QuicheStringPiece payload) = 0;
     // Called when a HEADERS frame has been completely processed.
-    // |frame_len| is the length of the HEADERS frame payload.
     virtual bool OnHeadersFrameEnd() = 0;
 
     // Called when a PUSH_PROMISE frame has been received.
     virtual bool OnPushPromiseFrameStart(QuicByteCount header_length) = 0;
     // Called when the Push ID field of a PUSH_PROMISE frame has been parsed.
     // Called exactly once for a valid PUSH_PROMISE frame.
-    virtual bool OnPushPromiseFramePushId(PushId push_id,
-                                          QuicByteCount push_id_length) = 0;
+    // |push_id_length| is the length of the push ID field.
+    // |header_block_length| is the length of the compressed header block.
+    virtual bool OnPushPromiseFramePushId(
+        PushId push_id,
+        QuicByteCount push_id_length,
+        QuicByteCount header_block_length) = 0;
     // Called when part of the header block of a PUSH_PROMISE frame has been
     // read. May be called multiple times for a single frame.  |payload| is
     // guaranteed to be non-empty.
@@ -98,9 +105,11 @@
 
     // Called when a frame of unknown type |frame_type| has been received.
     // Frame type might be reserved, Visitor must make sure to ignore.
-    // |header_length| contains frame length and payload length.
+    // |header_length| and |payload_length| are the length of the frame header
+    // and payload, respectively.
     virtual bool OnUnknownFrameStart(uint64_t frame_type,
-                                     QuicByteCount header_length) = 0;
+                                     QuicByteCount header_length,
+                                     QuicByteCount payload_length) = 0;
     // Called when part of the payload of the unknown frame has been read.  May
     // be called multiple times for a single frame.  |payload| is guaranteed to
     // be non-empty.
diff --git a/quic/core/http/http_decoder_test.cc b/quic/core/http/http_decoder_test.cc
index 1dba599..d97cbc1 100644
--- a/quic/core/http/http_decoder_test.cc
+++ b/quic/core/http/http_decoder_test.cc
@@ -47,17 +47,21 @@
   MOCK_METHOD1(OnSettingsFrameStart, bool(QuicByteCount header_length));
   MOCK_METHOD1(OnSettingsFrame, bool(const SettingsFrame& frame));
 
-  MOCK_METHOD1(OnDataFrameStart, bool(QuicByteCount header_length));
+  MOCK_METHOD2(OnDataFrameStart,
+               bool(QuicByteCount header_length, QuicByteCount payload_length));
   MOCK_METHOD1(OnDataFramePayload, bool(quiche::QuicheStringPiece payload));
   MOCK_METHOD0(OnDataFrameEnd, bool());
 
-  MOCK_METHOD1(OnHeadersFrameStart, bool(QuicByteCount header_length));
+  MOCK_METHOD2(OnHeadersFrameStart,
+               bool(QuicByteCount header_length, QuicByteCount payload_length));
   MOCK_METHOD1(OnHeadersFramePayload, bool(quiche::QuicheStringPiece payload));
   MOCK_METHOD0(OnHeadersFrameEnd, bool());
 
   MOCK_METHOD1(OnPushPromiseFrameStart, bool(QuicByteCount header_length));
-  MOCK_METHOD2(OnPushPromiseFramePushId,
-               bool(PushId push_id, QuicByteCount push_id_length));
+  MOCK_METHOD3(OnPushPromiseFramePushId,
+               bool(PushId push_id,
+                    QuicByteCount push_id_length,
+                    QuicByteCount header_block_length));
   MOCK_METHOD1(OnPushPromiseFramePayload,
                bool(quiche::QuicheStringPiece payload));
   MOCK_METHOD0(OnPushPromiseFrameEnd, bool());
@@ -65,8 +69,11 @@
   MOCK_METHOD1(OnPriorityUpdateFrameStart, bool(QuicByteCount header_length));
   MOCK_METHOD1(OnPriorityUpdateFrame, bool(const PriorityUpdateFrame& frame));
 
-  MOCK_METHOD2(OnUnknownFrameStart, bool(uint64_t, QuicByteCount));
-  MOCK_METHOD1(OnUnknownFramePayload, bool(quiche::QuicheStringPiece));
+  MOCK_METHOD3(OnUnknownFrameStart,
+               bool(uint64_t frame_type,
+                    QuicByteCount header_length,
+                    QuicByteCount payload_length));
+  MOCK_METHOD1(OnUnknownFramePayload, bool(quiche::QuicheStringPiece payload));
   MOCK_METHOD0(OnUnknownFrameEnd, bool());
 };
 
@@ -78,21 +85,21 @@
     ON_CALL(visitor_, OnGoAwayFrame(_)).WillByDefault(Return(true));
     ON_CALL(visitor_, OnSettingsFrameStart(_)).WillByDefault(Return(true));
     ON_CALL(visitor_, OnSettingsFrame(_)).WillByDefault(Return(true));
-    ON_CALL(visitor_, OnDataFrameStart(_)).WillByDefault(Return(true));
+    ON_CALL(visitor_, OnDataFrameStart(_, _)).WillByDefault(Return(true));
     ON_CALL(visitor_, OnDataFramePayload(_)).WillByDefault(Return(true));
     ON_CALL(visitor_, OnDataFrameEnd()).WillByDefault(Return(true));
-    ON_CALL(visitor_, OnHeadersFrameStart(_)).WillByDefault(Return(true));
+    ON_CALL(visitor_, OnHeadersFrameStart(_, _)).WillByDefault(Return(true));
     ON_CALL(visitor_, OnHeadersFramePayload(_)).WillByDefault(Return(true));
     ON_CALL(visitor_, OnHeadersFrameEnd()).WillByDefault(Return(true));
     ON_CALL(visitor_, OnPushPromiseFrameStart(_)).WillByDefault(Return(true));
-    ON_CALL(visitor_, OnPushPromiseFramePushId(_, _))
+    ON_CALL(visitor_, OnPushPromiseFramePushId(_, _, _))
         .WillByDefault(Return(true));
     ON_CALL(visitor_, OnPushPromiseFramePayload(_)).WillByDefault(Return(true));
     ON_CALL(visitor_, OnPushPromiseFrameEnd()).WillByDefault(Return(true));
     ON_CALL(visitor_, OnPriorityUpdateFrameStart(_))
         .WillByDefault(Return(true));
     ON_CALL(visitor_, OnPriorityUpdateFrame(_)).WillByDefault(Return(true));
-    ON_CALL(visitor_, OnUnknownFrameStart(_, _)).WillByDefault(Return(true));
+    ON_CALL(visitor_, OnUnknownFrameStart(_, _, _)).WillByDefault(Return(true));
     ON_CALL(visitor_, OnUnknownFramePayload(_)).WillByDefault(Return(true));
     ON_CALL(visitor_, OnUnknownFrameEnd()).WillByDefault(Return(true));
   }
@@ -168,7 +175,8 @@
         writer.WriteStringPiece(data);
       }
 
-      EXPECT_CALL(visitor_, OnUnknownFrameStart(frame_type, header_length));
+      EXPECT_CALL(visitor_, OnUnknownFrameStart(frame_type, header_length,
+                                                payload_length));
       if (payload_length > 0) {
         EXPECT_CALL(visitor_, OnUnknownFramePayload(Eq(data)));
       }
@@ -220,7 +228,7 @@
 
   // Visitor pauses processing.
   EXPECT_CALL(visitor_, OnPushPromiseFrameStart(2)).WillOnce(Return(false));
-  EXPECT_CALL(visitor_, OnPushPromiseFramePushId(257, 8))
+  EXPECT_CALL(visitor_, OnPushPromiseFramePushId(257, 8, 7))
       .WillOnce(Return(false));
   quiche::QuicheStringPiece remaining_input(input);
   QuicByteCount processed_bytes =
@@ -244,7 +252,7 @@
 
   // Process the full frame.
   EXPECT_CALL(visitor_, OnPushPromiseFrameStart(2));
-  EXPECT_CALL(visitor_, OnPushPromiseFramePushId(257, 8));
+  EXPECT_CALL(visitor_, OnPushPromiseFramePushId(257, 8, 7));
   EXPECT_CALL(visitor_,
               OnPushPromiseFramePayload(quiche::QuicheStringPiece("Headers")));
   EXPECT_CALL(visitor_, OnPushPromiseFrameEnd());
@@ -254,7 +262,7 @@
 
   // Process the frame incrementally.
   EXPECT_CALL(visitor_, OnPushPromiseFrameStart(2));
-  EXPECT_CALL(visitor_, OnPushPromiseFramePushId(257, 8));
+  EXPECT_CALL(visitor_, OnPushPromiseFramePushId(257, 8, 7));
   EXPECT_CALL(visitor_,
               OnPushPromiseFramePayload(quiche::QuicheStringPiece("H")));
   EXPECT_CALL(visitor_,
@@ -276,7 +284,7 @@
 
   // Process push id incrementally and append headers with last byte of push id.
   EXPECT_CALL(visitor_, OnPushPromiseFrameStart(2));
-  EXPECT_CALL(visitor_, OnPushPromiseFramePushId(257, 8));
+  EXPECT_CALL(visitor_, OnPushPromiseFramePushId(257, 8, 7));
   EXPECT_CALL(visitor_,
               OnPushPromiseFramePayload(quiche::QuicheStringPiece("Headers")));
   EXPECT_CALL(visitor_, OnPushPromiseFrameEnd());
@@ -452,7 +460,7 @@
       "Data!");                                  // data
 
   // Visitor pauses processing.
-  EXPECT_CALL(visitor_, OnDataFrameStart(2)).WillOnce(Return(false));
+  EXPECT_CALL(visitor_, OnDataFrameStart(2, 5)).WillOnce(Return(false));
   quiche::QuicheStringPiece remaining_input(input);
   QuicByteCount processed_bytes =
       ProcessInputWithGarbageAppended(remaining_input);
@@ -470,7 +478,7 @@
   EXPECT_EQ("", decoder_.error_detail());
 
   // Process the full frame.
-  EXPECT_CALL(visitor_, OnDataFrameStart(2));
+  EXPECT_CALL(visitor_, OnDataFrameStart(2, 5));
   EXPECT_CALL(visitor_, OnDataFramePayload(quiche::QuicheStringPiece("Data!")));
   EXPECT_CALL(visitor_, OnDataFrameEnd());
   EXPECT_EQ(input.size(), ProcessInput(input));
@@ -478,7 +486,7 @@
   EXPECT_EQ("", decoder_.error_detail());
 
   // Process the frame incrementally.
-  EXPECT_CALL(visitor_, OnDataFrameStart(2));
+  EXPECT_CALL(visitor_, OnDataFrameStart(2, 5));
   EXPECT_CALL(visitor_, OnDataFramePayload(quiche::QuicheStringPiece("D")));
   EXPECT_CALL(visitor_, OnDataFramePayload(quiche::QuicheStringPiece("a")));
   EXPECT_CALL(visitor_, OnDataFramePayload(quiche::QuicheStringPiece("t")));
@@ -504,7 +512,7 @@
   EXPECT_EQ("", decoder_.error_detail());
 
   // Send the rest of the header.
-  EXPECT_CALL(visitor_, OnDataFrameStart(3));
+  EXPECT_CALL(visitor_, OnDataFrameStart(3, input.length()));
   EXPECT_EQ(header_length - 1,
             decoder_.ProcessInput(header.data() + 1, header_length - 1));
   EXPECT_THAT(decoder_.error(), IsQuicNoError());
@@ -531,7 +539,8 @@
   writer.WriteVarInt62(frame_type);
   writer.WriteVarInt62(payload_length);
 
-  EXPECT_CALL(visitor_, OnUnknownFrameStart(frame_type, header_length));
+  EXPECT_CALL(visitor_,
+              OnUnknownFrameStart(frame_type, header_length, payload_length));
   EXPECT_CALL(visitor_, OnUnknownFrameEnd());
 
   auto raw_input = input.get();
@@ -580,7 +589,7 @@
       "Headers");                                // headers
 
   // Visitor pauses processing.
-  EXPECT_CALL(visitor_, OnHeadersFrameStart(2)).WillOnce(Return(false));
+  EXPECT_CALL(visitor_, OnHeadersFrameStart(2, 7)).WillOnce(Return(false));
   quiche::QuicheStringPiece remaining_input(input);
   QuicByteCount processed_bytes =
       ProcessInputWithGarbageAppended(remaining_input);
@@ -599,7 +608,7 @@
   EXPECT_EQ("", decoder_.error_detail());
 
   // Process the full frame.
-  EXPECT_CALL(visitor_, OnHeadersFrameStart(2));
+  EXPECT_CALL(visitor_, OnHeadersFrameStart(2, 7));
   EXPECT_CALL(visitor_,
               OnHeadersFramePayload(quiche::QuicheStringPiece("Headers")));
   EXPECT_CALL(visitor_, OnHeadersFrameEnd());
@@ -608,7 +617,7 @@
   EXPECT_EQ("", decoder_.error_detail());
 
   // Process the frame incrementally.
-  EXPECT_CALL(visitor_, OnHeadersFrameStart(2));
+  EXPECT_CALL(visitor_, OnHeadersFrameStart(2, 7));
   EXPECT_CALL(visitor_, OnHeadersFramePayload(quiche::QuicheStringPiece("H")));
   EXPECT_CALL(visitor_, OnHeadersFramePayload(quiche::QuicheStringPiece("e")));
   EXPECT_CALL(visitor_, OnHeadersFramePayload(quiche::QuicheStringPiece("a")));
@@ -629,7 +638,7 @@
       "00");  // length
 
   // Visitor pauses processing.
-  EXPECT_CALL(visitor_, OnDataFrameStart(2)).WillOnce(Return(false));
+  EXPECT_CALL(visitor_, OnDataFrameStart(2, 0)).WillOnce(Return(false));
   EXPECT_EQ(input.size(), ProcessInputWithGarbageAppended(input));
 
   EXPECT_CALL(visitor_, OnDataFrameEnd()).WillOnce(Return(false));
@@ -638,14 +647,14 @@
   EXPECT_EQ("", decoder_.error_detail());
 
   // Process the full frame.
-  EXPECT_CALL(visitor_, OnDataFrameStart(2));
+  EXPECT_CALL(visitor_, OnDataFrameStart(2, 0));
   EXPECT_CALL(visitor_, OnDataFrameEnd());
   EXPECT_EQ(input.size(), ProcessInput(input));
   EXPECT_THAT(decoder_.error(), IsQuicNoError());
   EXPECT_EQ("", decoder_.error_detail());
 
   // Process the frame incrementally.
-  EXPECT_CALL(visitor_, OnDataFrameStart(2));
+  EXPECT_CALL(visitor_, OnDataFrameStart(2, 0));
   EXPECT_CALL(visitor_, OnDataFrameEnd());
   ProcessInputCharByChar(input);
   EXPECT_THAT(decoder_.error(), IsQuicNoError());
@@ -659,7 +668,7 @@
       "00");  // length
 
   // Visitor pauses processing.
-  EXPECT_CALL(visitor_, OnHeadersFrameStart(2)).WillOnce(Return(false));
+  EXPECT_CALL(visitor_, OnHeadersFrameStart(2, 0)).WillOnce(Return(false));
   EXPECT_EQ(input.size(), ProcessInputWithGarbageAppended(input));
 
   EXPECT_CALL(visitor_, OnHeadersFrameEnd()).WillOnce(Return(false));
@@ -668,14 +677,14 @@
   EXPECT_EQ("", decoder_.error_detail());
 
   // Process the full frame.
-  EXPECT_CALL(visitor_, OnHeadersFrameStart(2));
+  EXPECT_CALL(visitor_, OnHeadersFrameStart(2, 0));
   EXPECT_CALL(visitor_, OnHeadersFrameEnd());
   EXPECT_EQ(input.size(), ProcessInput(input));
   EXPECT_THAT(decoder_.error(), IsQuicNoError());
   EXPECT_EQ("", decoder_.error_detail());
 
   // Process the frame incrementally.
-  EXPECT_CALL(visitor_, OnHeadersFrameStart(2));
+  EXPECT_CALL(visitor_, OnHeadersFrameStart(2, 0));
   EXPECT_CALL(visitor_, OnHeadersFrameEnd());
   ProcessInputCharByChar(input);
   EXPECT_THAT(decoder_.error(), IsQuicNoError());
@@ -691,7 +700,8 @@
 
   // Visitor pauses processing.
   EXPECT_CALL(visitor_, OnPushPromiseFrameStart(2));
-  EXPECT_CALL(visitor_, OnPushPromiseFramePushId(1, 1)).WillOnce(Return(false));
+  EXPECT_CALL(visitor_, OnPushPromiseFramePushId(1, 1, 0))
+      .WillOnce(Return(false));
   EXPECT_EQ(input.size(), ProcessInputWithGarbageAppended(input));
 
   EXPECT_CALL(visitor_, OnPushPromiseFrameEnd()).WillOnce(Return(false));
@@ -701,7 +711,7 @@
 
   // Process the full frame.
   EXPECT_CALL(visitor_, OnPushPromiseFrameStart(2));
-  EXPECT_CALL(visitor_, OnPushPromiseFramePushId(1, 1));
+  EXPECT_CALL(visitor_, OnPushPromiseFramePushId(1, 1, 0));
   EXPECT_CALL(visitor_, OnPushPromiseFrameEnd());
   EXPECT_EQ(input.size(), ProcessInput(input));
   EXPECT_THAT(decoder_.error(), IsQuicNoError());
@@ -709,7 +719,7 @@
 
   // Process the frame incrementally.
   EXPECT_CALL(visitor_, OnPushPromiseFrameStart(2));
-  EXPECT_CALL(visitor_, OnPushPromiseFramePushId(1, 1));
+  EXPECT_CALL(visitor_, OnPushPromiseFramePushId(1, 1, 0));
   EXPECT_CALL(visitor_, OnPushPromiseFrameEnd());
   ProcessInputCharByChar(input);
   EXPECT_THAT(decoder_.error(), IsQuicNoError());
@@ -754,7 +764,7 @@
       "Data!");                                  // data
 
   // Visitor pauses processing, maybe because header decompression is blocked.
-  EXPECT_CALL(visitor_, OnHeadersFrameStart(2));
+  EXPECT_CALL(visitor_, OnHeadersFrameStart(2, 7));
   EXPECT_CALL(visitor_,
               OnHeadersFramePayload(quiche::QuicheStringPiece("Headers")));
   EXPECT_CALL(visitor_, OnHeadersFrameEnd()).WillOnce(Return(false));
@@ -765,7 +775,7 @@
   remaining_input = remaining_input.substr(processed_bytes);
 
   // Process DATA frame.
-  EXPECT_CALL(visitor_, OnDataFrameStart(2));
+  EXPECT_CALL(visitor_, OnDataFrameStart(2, 5));
   EXPECT_CALL(visitor_, OnDataFramePayload(quiche::QuicheStringPiece("Data!")));
   EXPECT_CALL(visitor_, OnDataFrameEnd());
 
diff --git a/quic/core/http/quic_receive_control_stream.cc b/quic/core/http/quic_receive_control_stream.cc
index 7e74025..fa9ae5c 100644
--- a/quic/core/http/quic_receive_control_stream.cc
+++ b/quic/core/http/quic_receive_control_stream.cc
@@ -78,7 +78,8 @@
     return stream_->OnSettingsFrame(frame);
   }
 
-  bool OnDataFrameStart(QuicByteCount /*header_length*/) override {
+  bool OnDataFrameStart(QuicByteCount /*header_length*/, QuicByteCount
+                        /*payload_length*/) override {
     OnWrongFrame("Data");
     return false;
   }
@@ -93,7 +94,8 @@
     return false;
   }
 
-  bool OnHeadersFrameStart(QuicByteCount /*header_length*/) override {
+  bool OnHeadersFrameStart(QuicByteCount /*header_length*/, QuicByteCount
+                           /*payload_length*/) override {
     OnWrongFrame("Headers");
     return false;
   }
@@ -113,8 +115,10 @@
     return false;
   }
 
-  bool OnPushPromiseFramePushId(PushId /*push_id*/,
-                                QuicByteCount /*push_id_length*/) override {
+  bool OnPushPromiseFramePushId(
+      PushId /*push_id*/,
+      QuicByteCount /*push_id_length*/,
+      QuicByteCount /*header_block_length*/) override {
     OnWrongFrame("Push Promise");
     return false;
   }
@@ -139,7 +143,8 @@
   }
 
   bool OnUnknownFrameStart(uint64_t frame_type,
-                           QuicByteCount /* header_length */) override {
+                           QuicByteCount /* header_length */,
+                           QuicByteCount /* payload_length */) override {
     if (stream_->spdy_session()->debug_visitor()) {
       stream_->spdy_session()->debug_visitor()->OnUnknownFrameStart(
           stream_->id(), frame_type);
diff --git a/quic/core/http/quic_spdy_stream.cc b/quic/core/http/quic_spdy_stream.cc
index 3a4c146..573ab90 100644
--- a/quic/core/http/quic_spdy_stream.cc
+++ b/quic/core/http/quic_spdy_stream.cc
@@ -69,8 +69,9 @@
     return false;
   }
 
-  bool OnDataFrameStart(QuicByteCount header_length) override {
-    return stream_->OnDataFrameStart(header_length);
+  bool OnDataFrameStart(QuicByteCount header_length,
+                        QuicByteCount payload_length) override {
+    return stream_->OnDataFrameStart(header_length, payload_length);
   }
 
   bool OnDataFramePayload(quiche::QuicheStringPiece payload) override {
@@ -80,12 +81,13 @@
 
   bool OnDataFrameEnd() override { return stream_->OnDataFrameEnd(); }
 
-  bool OnHeadersFrameStart(QuicByteCount header_length) override {
+  bool OnHeadersFrameStart(QuicByteCount header_length,
+                           QuicByteCount payload_length) override {
     if (!VersionUsesHttp3(stream_->transport_version())) {
       CloseConnectionOnWrongFrame("Headers");
       return false;
     }
-    return stream_->OnHeadersFrameStart(header_length);
+    return stream_->OnHeadersFrameStart(header_length, payload_length);
   }
 
   bool OnHeadersFramePayload(quiche::QuicheStringPiece payload) override {
@@ -114,12 +116,14 @@
   }
 
   bool OnPushPromiseFramePushId(PushId push_id,
-                                QuicByteCount push_id_length) override {
+                                QuicByteCount push_id_length,
+                                QuicByteCount header_block_length) override {
     if (!VersionUsesHttp3(stream_->transport_version())) {
       CloseConnectionOnWrongFrame("Push Promise");
       return false;
     }
-    return stream_->OnPushPromiseFramePushId(push_id, push_id_length);
+    return stream_->OnPushPromiseFramePushId(push_id, push_id_length,
+                                             header_block_length);
   }
 
   bool OnPushPromiseFramePayload(quiche::QuicheStringPiece payload) override {
@@ -150,8 +154,10 @@
   }
 
   bool OnUnknownFrameStart(uint64_t frame_type,
-                           QuicByteCount header_length) override {
-    return stream_->OnUnknownFrameStart(frame_type, header_length);
+                           QuicByteCount header_length,
+                           QuicByteCount payload_length) override {
+    return stream_->OnUnknownFrameStart(frame_type, header_length,
+                                        payload_length);
   }
 
   bool OnUnknownFramePayload(quiche::QuicheStringPiece payload) override {
@@ -860,7 +866,8 @@
   spdy_session_ = nullptr;
 }
 
-bool QuicSpdyStream::OnDataFrameStart(QuicByteCount header_length) {
+bool QuicSpdyStream::OnDataFrameStart(QuicByteCount header_length,
+                                      QuicByteCount /*payload_length*/) {
   DCHECK(VersionUsesHttp3(transport_version()));
   if (!headers_decompressed_ || trailers_decompressed_) {
     stream_delegate()->OnStreamError(
@@ -952,7 +959,8 @@
   return header_acked_length;
 }
 
-bool QuicSpdyStream::OnHeadersFrameStart(QuicByteCount header_length) {
+bool QuicSpdyStream::OnHeadersFrameStart(QuicByteCount header_length,
+                                         QuicByteCount /*payload_length*/) {
   DCHECK(VersionUsesHttp3(transport_version()));
   DCHECK(!qpack_decoded_headers_accumulator_);
 
@@ -977,6 +985,9 @@
   DCHECK(VersionUsesHttp3(transport_version()));
   DCHECK(qpack_decoded_headers_accumulator_);
 
+  // TODO(b/152518220): Save |payload_length| argument of OnHeadersFrameStart()
+  // instead of accumulating payload length in |headers_payload_length_| or
+  // |trailers_payload_length_|.
   if (headers_decompressed_) {
     trailers_payload_length_ += payload.length();
   } else {
@@ -1031,8 +1042,10 @@
   return true;
 }
 
-bool QuicSpdyStream::OnPushPromiseFramePushId(PushId push_id,
-                                              QuicByteCount push_id_length) {
+bool QuicSpdyStream::OnPushPromiseFramePushId(
+    PushId push_id,
+    QuicByteCount push_id_length,
+    QuicByteCount /*header_block_length*/) {
   DCHECK(VersionUsesHttp3(transport_version()));
   DCHECK(!qpack_decoded_headers_accumulator_);
 
@@ -1061,7 +1074,8 @@
 }
 
 bool QuicSpdyStream::OnUnknownFrameStart(uint64_t frame_type,
-                                         QuicByteCount header_length) {
+                                         QuicByteCount header_length,
+                                         QuicByteCount /*payload_length*/) {
   if (spdy_session_->debug_visitor()) {
     spdy_session_->debug_visitor()->OnUnknownFrameStart(id(), frame_type);
   }
diff --git a/quic/core/http/quic_spdy_stream.h b/quic/core/http/quic_spdy_stream.h
index e231a35..abf3ef4 100644
--- a/quic/core/http/quic_spdy_stream.h
+++ b/quic/core/http/quic_spdy_stream.h
@@ -258,17 +258,23 @@
   class HttpDecoderVisitor;
 
   // Called by HttpDecoderVisitor.
-  bool OnDataFrameStart(QuicByteCount header_length);
+  bool OnDataFrameStart(QuicByteCount header_length,
+                        QuicByteCount payload_length);
   bool OnDataFramePayload(quiche::QuicheStringPiece payload);
   bool OnDataFrameEnd();
-  bool OnHeadersFrameStart(QuicByteCount header_length);
+  bool OnHeadersFrameStart(QuicByteCount header_length,
+                           QuicByteCount payload_length);
   bool OnHeadersFramePayload(quiche::QuicheStringPiece payload);
   bool OnHeadersFrameEnd();
   bool OnPushPromiseFrameStart(QuicByteCount header_length);
-  bool OnPushPromiseFramePushId(PushId push_id, QuicByteCount push_id_length);
+  bool OnPushPromiseFramePushId(PushId push_id,
+                                QuicByteCount push_id_length,
+                                QuicByteCount header_block_length);
   bool OnPushPromiseFramePayload(quiche::QuicheStringPiece payload);
   bool OnPushPromiseFrameEnd();
-  bool OnUnknownFrameStart(uint64_t frame_type, QuicByteCount header_length);
+  bool OnUnknownFrameStart(uint64_t frame_type,
+                           QuicByteCount header_length,
+                           QuicByteCount payload_length);
   bool OnUnknownFramePayload(quiche::QuicheStringPiece payload);
   bool OnUnknownFrameEnd();