blob: 50c61eb3cf24b553dc31f0a50a52703c97897ec7 [file] [log] [blame]
// Copyright (c) 2016 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_QUIC_VERSION_MANAGER_H_
#define QUICHE_QUIC_CORE_QUIC_VERSION_MANAGER_H_
#include "quic/core/quic_versions.h"
#include "quic/platform/api/quic_export.h"
namespace quic {
// Used to generate filtered supported versions based on flags.
class QUIC_EXPORT_PRIVATE QuicVersionManager {
public:
// |supported_versions| should be sorted in the order of preference (typically
// highest supported version to the lowest supported version).
explicit QuicVersionManager(ParsedQuicVersionVector supported_versions);
virtual ~QuicVersionManager();
// Returns currently supported QUIC versions. This vector has the same order
// as the versions passed to the constructor.
const ParsedQuicVersionVector& GetSupportedVersions();
// Returns currently supported versions using HTTP/3.
const ParsedQuicVersionVector& GetSupportedVersionsWithOnlyHttp3();
// Returns currently supported versions using QUIC crypto.
const ParsedQuicVersionVector& GetSupportedVersionsWithQuicCrypto();
// Returns the list of supported ALPNs, based on the current supported
// versions and any custom additions by subclasses.
const std::vector<std::string>& GetSupportedAlpns();
protected:
// If the value of any reloadable flag is different from the cached value,
// re-filter |filtered_supported_versions_| and update the cached flag values.
// Otherwise, does nothing.
// TODO(dschinazi): Make private when deprecating
// FLAGS_gfe2_restart_flag_quic_disable_old_alt_svc_format.
void MaybeRefilterSupportedVersions();
// Refilters filtered_supported_versions_.
virtual void RefilterSupportedVersions();
// RefilterSupportedVersions() must be called before calling this method.
// TODO(dschinazi): Remove when deprecating
// FLAGS_gfe2_restart_flag_quic_disable_old_alt_svc_format.
const QuicTransportVersionVector& filtered_transport_versions() const {
return filtered_transport_versions_;
}
// Subclasses may add custom ALPNs to the supported list by overriding
// RefilterSupportedVersions() to first call
// QuicVersionManager::RefilterSupportedVersions() then AddCustomAlpn().
// Must not be called elsewhere.
void AddCustomAlpn(const std::string& alpn);
private:
// Cached value of reloadable flags.
// quic_disable_version_rfcv1 flag
bool disable_version_rfcv1_ = true;
// quic_disable_version_draft_29 flag
bool disable_version_draft_29_ = true;
// quic_disable_version_t051 flag
bool disable_version_t051_ = true;
// quic_disable_version_q050 flag
bool disable_version_q050_ = true;
// quic_disable_version_q046 flag
bool disable_version_q046_ = true;
// quic_disable_version_q043 flag
bool disable_version_q043_ = true;
// The list of versions that may be supported.
const ParsedQuicVersionVector allowed_supported_versions_;
// The following vectors are calculated from reloadable flags by
// RefilterSupportedVersions(). It is performed lazily when first needed, and
// after that, since the calculation is relatively expensive, only if the flag
// values change.
// This vector contains QUIC versions which are currently supported based on
// flags.
ParsedQuicVersionVector filtered_supported_versions_;
// Currently supported versions using HTTP/3.
ParsedQuicVersionVector filtered_supported_versions_with_http3_;
// Currently supported versions using QUIC crypto.
ParsedQuicVersionVector filtered_supported_versions_with_quic_crypto_;
// This vector contains the transport versions from
// |filtered_supported_versions_|. No guarantees are made that the same
// transport version isn't repeated.
QuicTransportVersionVector filtered_transport_versions_;
// Contains the list of ALPNs corresponding to filtered_supported_versions_
// with custom ALPNs added.
std::vector<std::string> filtered_supported_alpns_;
};
} // namespace quic
#endif // QUICHE_QUIC_CORE_QUIC_VERSION_MANAGER_H_