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();