renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 1 | // Copyright 2019 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #ifndef QUICHE_QUIC_CORE_QPACK_QPACK_SEND_STREAM_H_ |
| 6 | #define QUICHE_QUIC_CORE_QPACK_QPACK_SEND_STREAM_H_ |
| 7 | |
bnc | d7d6763 | 2019-06-28 10:42:12 -0700 | [diff] [blame] | 8 | #include <cstdint> |
| 9 | |
renjietang | c2aa5cb | 2019-06-20 12:22:53 -0700 | [diff] [blame] | 10 | #include "net/third_party/quiche/src/quic/core/qpack/qpack_stream_sender_delegate.h" |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 11 | #include "net/third_party/quiche/src/quic/core/quic_stream.h" |
| 12 | #include "net/third_party/quiche/src/quic/platform/api/quic_export.h" |
bnc | d7d6763 | 2019-06-28 10:42:12 -0700 | [diff] [blame] | 13 | #include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 14 | |
| 15 | namespace quic { |
| 16 | |
renjietang | 89e7356 | 2019-07-22 11:24:22 -0700 | [diff] [blame] | 17 | class QuicSession; |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 18 | |
| 19 | // QPACK 4.2.1 Encoder and Decoder Streams. |
| 20 | // The QPACK send stream is self initiated and is write only. |
renjietang | c2aa5cb | 2019-06-20 12:22:53 -0700 | [diff] [blame] | 21 | class QUIC_EXPORT_PRIVATE QpackSendStream : public QuicStream, |
| 22 | public QpackStreamSenderDelegate { |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 23 | public: |
| 24 | // |session| can't be nullptr, and the ownership is not passed. |session| owns |
| 25 | // this stream. |
| 26 | QpackSendStream(QuicStreamId id, |
renjietang | 89e7356 | 2019-07-22 11:24:22 -0700 | [diff] [blame] | 27 | QuicSession* session, |
renjietang | a2736fc | 2019-07-18 11:07:23 -0700 | [diff] [blame] | 28 | uint64_t http3_stream_type); |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 29 | QpackSendStream(const QpackSendStream&) = delete; |
| 30 | QpackSendStream& operator=(const QpackSendStream&) = delete; |
| 31 | ~QpackSendStream() override = default; |
| 32 | |
| 33 | // Overriding QuicStream::OnStreamReset to make sure QPACK stream is |
| 34 | // never closed before connection. |
| 35 | void OnStreamReset(const QuicRstStreamFrame& frame) override; |
| 36 | |
| 37 | // The send QPACK stream is write unidirectional, so this method |
| 38 | // should never be called. |
| 39 | void OnDataAvailable() override { QUIC_NOTREACHED(); } |
| 40 | |
| 41 | // Writes the instructions to peer. The stream type will be sent |
| 42 | // before the first instruction so that the peer can open an qpack stream. |
renjietang | c2aa5cb | 2019-06-20 12:22:53 -0700 | [diff] [blame] | 43 | void WriteStreamData(QuicStringPiece data) override; |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 44 | |
renjietang | 87cd7de | 2019-08-16 08:35:10 -0700 | [diff] [blame] | 45 | // TODO(b/112770235): Remove this method once QuicStreamIdManager supports |
| 46 | // creating HTTP/3 unidirectional streams dynamically. |
renjietang | c8c02a5 | 2019-08-22 10:38:37 -0700 | [diff] [blame] | 47 | void MaybeSendStreamType(); |
renjietang | 87cd7de | 2019-08-16 08:35:10 -0700 | [diff] [blame] | 48 | |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 49 | private: |
renjietang | a2736fc | 2019-07-18 11:07:23 -0700 | [diff] [blame] | 50 | const uint64_t http3_stream_type_; |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 51 | bool stream_type_sent_; |
| 52 | }; |
| 53 | |
| 54 | } // namespace quic |
| 55 | |
| 56 | #endif // QUICHE_QUIC_CORE_QPACK_QPACK_SEND_STREAM_H_ |