Remove HttpDecoder::has_payload().
Instead of polling has_payload(), query QuicSpdyStreamBodyBuffer::HasBytesToRead().
Note the subtle change in behavior: OnBodyAvailable() will be called even if there
is no new payload decoded but the consumer has not read all the buffer previously.
Also add DCHECKs to QuicSpdyStream() methods that are only supposed to be called
in v99.
gfe-relnote: n/a. Other than adding a DCHECK, change behavior in QUIC v99 only. Not flag protected.
PiperOrigin-RevId: 238306060
Change-Id: I044ea4c0e49064c5193958b44c6cee61eb15e08f
diff --git a/quic/core/http/quic_spdy_stream.cc b/quic/core/http/quic_spdy_stream.cc
index 9aa4ce7..ce1370b 100644
--- a/quic/core/http/quic_spdy_stream.cc
+++ b/quic/core/http/quic_spdy_stream.cc
@@ -470,6 +470,8 @@
}
void QuicSpdyStream::OnDataAvailable() {
+ DCHECK(FinishedReadingHeaders());
+
if (!VersionHasDataFrameHeader(
session()->connection()->transport_version())) {
OnBodyAvailable();
@@ -477,16 +479,12 @@
}
iovec iov;
- bool has_payload = false;
while (sequencer()->PrefetchNextRegion(&iov)) {
decoder_.ProcessInput(reinterpret_cast<const char*>(iov.iov_base),
iov.iov_len);
- if (decoder_.has_payload()) {
- has_payload = true;
- }
}
- if (has_payload) {
+ if (body_buffer_.HasBytesToRead()) {
OnBodyAvailable();
return;
}
@@ -560,14 +558,22 @@
}
void QuicSpdyStream::OnDataFrameStart(Http3FrameLengths frame_lengths) {
+ DCHECK(
+ VersionHasDataFrameHeader(session()->connection()->transport_version()));
+
body_buffer_.OnDataHeader(frame_lengths);
}
void QuicSpdyStream::OnDataFramePayload(QuicStringPiece payload) {
+ DCHECK(
+ VersionHasDataFrameHeader(session()->connection()->transport_version()));
+
body_buffer_.OnDataPayload(payload);
}
void QuicSpdyStream::OnDataFrameEnd() {
+ DCHECK(
+ VersionHasDataFrameHeader(session()->connection()->transport_version()));
DVLOG(1) << "Reaches the end of a data frame. Total bytes received are "
<< body_buffer_.total_body_bytes_received();
}