blob: 155b423ae720632618f481b1ca27cf85afe53596 [file] [log] [blame]
// 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_HTTP_QUIC_SEND_CONTROL_STREAM_H_
#define QUICHE_QUIC_CORE_HTTP_QUIC_SEND_CONTROL_STREAM_H_
#include "quic/core/http/http_encoder.h"
#include "quic/core/quic_stream.h"
#include "quic/core/quic_types.h"
#include "quic/platform/api/quic_export.h"
#include "quic/platform/api/quic_logging.h"
namespace quic {
class QuicSpdySession;
// 6.2.1 Control Stream.
// The send control stream is self initiated and is write only.
class QUIC_EXPORT_PRIVATE QuicSendControlStream : public QuicStream {
public:
// |session| can't be nullptr, and the ownership is not passed. The stream can
// only be accessed through the session.
QuicSendControlStream(QuicStreamId id,
QuicSpdySession* session,
const SettingsFrame& settings);
QuicSendControlStream(const QuicSendControlStream&) = delete;
QuicSendControlStream& operator=(const QuicSendControlStream&) = delete;
~QuicSendControlStream() override = default;
// Overriding QuicStream::OnStopSending() to make sure control stream is never
// closed before connection.
void OnStreamReset(const QuicRstStreamFrame& frame) override;
bool OnStopSending(QuicRstStreamErrorCode code) override;
// Send SETTINGS frame if it hasn't been sent yet. Settings frame must be the
// first frame sent on this stream.
void MaybeSendSettingsFrame();
// Send a MAX_PUSH_ID frame on this stream, and a SETTINGS frame beforehand if
// one has not been already sent. Must only be called for a client.
void SendMaxPushIdFrame(PushId max_push_id);
// Send a PRIORITY_UPDATE frame on this stream, and a SETTINGS frame
// beforehand if one has not been already sent.
void WritePriorityUpdate(const PriorityUpdateFrame& priority_update);
// Send a GOAWAY frame on this stream, and a SETTINGS frame beforehand if one
// has not been already sent.
void SendGoAway(QuicStreamId id);
// The send control stream is write unidirectional, so this method should
// never be called.
void OnDataAvailable() override { QUIC_NOTREACHED(); }
private:
// Track if a settings frame is already sent.
bool settings_sent_;
// SETTINGS values to send.
const SettingsFrame settings_;
QuicSpdySession* const spdy_session_;
};
} // namespace quic
#endif // QUICHE_QUIC_CORE_HTTP_QUIC_SEND_CONTROL_STREAM_H_