| // 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 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); | |
| // TODO(dschinazi): Remove when deprecating | |
| // FLAGS_gfe2_restart_flag_quic_disable_old_alt_svc_format. | |
| bool disable_version_q050() const; | |
| private: | |
| // Cached value of gfe2_restart_flag_quic_lazy_quic_version_manager for | |
| // brevity. | |
| const bool lazy_; | |
| // Cached value of reloadable flags. | |
| // quic_disable_version_rfcv1 flag | |
| bool disable_version_rfcv1_; | |
| // quic_disable_version_draft_29 flag | |
| bool disable_version_draft_29_; | |
| // quic_disable_version_t051 flag | |
| bool disable_version_t051_; | |
| // quic_disable_version_q050 flag | |
| bool disable_version_q050_; | |
| // quic_disable_version_q046 flag | |
| bool disable_version_q046_; | |
| // quic_disable_version_q043 flag | |
| bool disable_version_q043_; | |
| // 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 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_ |