| // Copyright 2019 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_QPACK_QPACK_SEND_STREAM_H_ | |
| #define QUICHE_QUIC_CORE_QPACK_QPACK_SEND_STREAM_H_ | |
| #include <cstdint> | |
| #include "absl/strings/string_view.h" | |
| #include "quiche/quic/core/qpack/qpack_stream_sender_delegate.h" | |
| #include "quiche/quic/core/quic_stream.h" | |
| #include "quiche/quic/platform/api/quic_export.h" | |
| #include "quiche/common/platform/api/quiche_logging.h" | |
| namespace quic { | |
| class QuicSession; | |
| // QPACK 4.2.1 Encoder and Decoder Streams. | |
| // The QPACK send stream is self initiated and is write only. | |
| class QUIC_EXPORT_PRIVATE QpackSendStream : public QuicStream, | |
| public QpackStreamSenderDelegate { | |
| public: | |
| // |session| can't be nullptr, and the ownership is not passed. |session| owns | |
| // this stream. | |
| QpackSendStream(QuicStreamId id, QuicSession* session, | |
| uint64_t http3_stream_type); | |
| QpackSendStream(const QpackSendStream&) = delete; | |
| QpackSendStream& operator=(const QpackSendStream&) = delete; | |
| ~QpackSendStream() override = default; | |
| // Overriding QuicStream::OnStopSending() to make sure QPACK stream is never | |
| // closed before connection. | |
| void OnStreamReset(const QuicRstStreamFrame& frame) override; | |
| bool OnStopSending(QuicResetStreamError code) override; | |
| // The send QPACK stream is write unidirectional, so this method | |
| // should never be called. | |
| void OnDataAvailable() override { QUICHE_NOTREACHED(); } | |
| // Writes the instructions to peer. The stream type will be sent | |
| // before the first instruction so that the peer can open an qpack stream. | |
| void WriteStreamData(absl::string_view data) override; | |
| // Return the number of bytes buffered due to underlying stream being blocked. | |
| uint64_t NumBytesBuffered() const override; | |
| // TODO(b/112770235): Remove this method once QuicStreamIdManager supports | |
| // creating HTTP/3 unidirectional streams dynamically. | |
| void MaybeSendStreamType(); | |
| private: | |
| const uint64_t http3_stream_type_; | |
| bool stream_type_sent_; | |
| }; | |
| } // namespace quic | |
| #endif // QUICHE_QUIC_CORE_QPACK_QPACK_SEND_STREAM_H_ |