blob: 2485aacb4469849a5ee2dfc7947d64d6409889aa [file] [log] [blame]
// 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_