| // Copyright (c) 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef QUICHE_QUIC_CORE_HTTP_QUIC_SPDY_STREAM_BODY_BUFFER_H_ |
| #define QUICHE_QUIC_CORE_HTTP_QUIC_SPDY_STREAM_BODY_BUFFER_H_ |
| |
| #include "net/third_party/quiche/src/quic/core/http/http_decoder.h" |
| #include "net/third_party/quiche/src/quic/core/quic_stream_sequencer.h" |
| #include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h" |
| |
| namespace quic { |
| |
| // Buffer decoded body for QuicSpdyStream. It also talks to the sequencer to |
| // consume data. |
| class QUIC_EXPORT_PRIVATE QuicSpdyStreamBodyBuffer { |
| public: |
| // QuicSpdyStreamBodyBuffer doesn't own the sequencer and the sequencer can |
| // outlive the buffer. |
| explicit QuicSpdyStreamBodyBuffer(QuicStreamSequencer* sequencer); |
| |
| ~QuicSpdyStreamBodyBuffer(); |
| |
| // Add metadata of the frame to accountings. |
| // Called when QuicSpdyStream receives data frame header. |
| void OnDataHeader(Http3FrameLengths frame_lengths); |
| |
| // Add new data payload to buffer. |
| // Called when QuicSpdyStream received data payload. |
| // Data pointed by payload must be alive until consumed by |
| // QuicStreamSequencer::MarkConsumed(). |
| void OnDataPayload(QuicStringPiece payload); |
| |
| // Take |num_bytes| as the body size, calculate header sizes accordingly, and |
| // consume the right amount of data in the stream sequencer. |
| void MarkBodyConsumed(size_t num_bytes); |
| |
| // Fill up to |iov_len| with bodies available in buffer. No data is consumed. |
| // |iov|.iov_base will point to data in the buffer, and |iov|.iov_len will |
| // be set to the underlying data length accordingly. |
| // Returns the number of iov used. |
| int PeekBody(iovec* iov, size_t iov_len) const; |
| |
| // Copies from buffer into |iov| up to |iov_len|, and consume data in |
| // sequencer. |iov.iov_base| and |iov.iov_len| are preassigned and will not be |
| // changed. |
| // Returns the number of bytes read. |
| size_t ReadBody(const struct iovec* iov, size_t iov_len); |
| |
| bool HasBytesToRead() const { return !bodies_.empty(); } |
| |
| uint64_t total_body_bytes_received() const { |
| return total_body_bytes_received_; |
| } |
| |
| private: |
| // Storage for decoded data. |
| QuicDeque<QuicStringPiece> bodies_; |
| // Storage for header lengths. |
| QuicDeque<Http3FrameLengths> frame_meta_; |
| // Bytes in the first available data frame that are not consumed yet. |
| QuicByteCount bytes_remaining_; |
| // Total available body data in the stream. |
| QuicByteCount total_body_bytes_readable_; |
| // Total bytes read from the stream excluding headers. |
| QuicByteCount total_body_bytes_received_; |
| // Total length of payloads tracked by frame_meta_. |
| QuicByteCount total_payload_lengths_; |
| // Stream sequencer that directly manages data in the stream. |
| QuicStreamSequencer* sequencer_; |
| }; |
| |
| } // namespace quic |
| |
| #endif // QUICHE_QUIC_CORE_HTTP_QUIC_SPDY_STREAM_BODY_BUFFER_H_ |