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