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