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 | #include "net/third_party/quiche/src/quic/core/qpack/qpack_send_stream.h" |
| 6 | |
renjietang | 89e7356 | 2019-07-22 11:24:22 -0700 | [diff] [blame] | 7 | #include "net/third_party/quiche/src/quic/core/quic_session.h" |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 8 | #include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h" |
| 9 | |
| 10 | namespace quic { |
| 11 | QpackSendStream::QpackSendStream(QuicStreamId id, |
renjietang | 89e7356 | 2019-07-22 11:24:22 -0700 | [diff] [blame] | 12 | QuicSession* session, |
renjietang | a2736fc | 2019-07-18 11:07:23 -0700 | [diff] [blame] | 13 | uint64_t http3_stream_type) |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 14 | : QuicStream(id, session, /*is_static = */ true, WRITE_UNIDIRECTIONAL), |
renjietang | a2736fc | 2019-07-18 11:07:23 -0700 | [diff] [blame] | 15 | http3_stream_type_(http3_stream_type), |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 16 | stream_type_sent_(false) {} |
| 17 | |
dschinazi | 17d4242 | 2019-06-18 16:35:07 -0700 | [diff] [blame] | 18 | void QpackSendStream::OnStreamReset(const QuicRstStreamFrame& /*frame*/) { |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 19 | // TODO(renjietang) Change the error code to H/3 specific |
| 20 | // HTTP_CLOSED_CRITICAL_STREAM. |
| 21 | session()->connection()->CloseConnection( |
| 22 | QUIC_INVALID_STREAM_ID, "Attempt to reset qpack send stream", |
| 23 | ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); |
| 24 | } |
| 25 | |
| 26 | void QpackSendStream::WriteStreamData(QuicStringPiece data) { |
fayang | a4b37b2 | 2019-06-18 13:37:47 -0700 | [diff] [blame] | 27 | QuicConnection::ScopedPacketFlusher flusher(session()->connection()); |
renjietang | c8c02a5 | 2019-08-22 10:38:37 -0700 | [diff] [blame] | 28 | MaybeSendStreamType(); |
renjietang | d6f5afa | 2019-08-19 11:27:55 -0700 | [diff] [blame] | 29 | WriteOrBufferData(data, false, nullptr); |
| 30 | } |
| 31 | |
renjietang | c8c02a5 | 2019-08-22 10:38:37 -0700 | [diff] [blame] | 32 | void QpackSendStream::MaybeSendStreamType() { |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 33 | if (!stream_type_sent_) { |
renjietang | a2736fc | 2019-07-18 11:07:23 -0700 | [diff] [blame] | 34 | char type[sizeof(http3_stream_type_)]; |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 35 | QuicDataWriter writer(QUIC_ARRAYSIZE(type), type); |
renjietang | a2736fc | 2019-07-18 11:07:23 -0700 | [diff] [blame] | 36 | writer.WriteVarInt62(http3_stream_type_); |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 37 | WriteOrBufferData(QuicStringPiece(writer.data(), writer.length()), false, |
| 38 | nullptr); |
| 39 | stream_type_sent_ = true; |
| 40 | } |
renjietang | 87cd7de | 2019-08-16 08:35:10 -0700 | [diff] [blame] | 41 | } |
| 42 | |
renjietang | d21094b | 2019-06-14 09:39:11 -0700 | [diff] [blame] | 43 | } // namespace quic |