1 // Copyright (c) 2016 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_QUIC_VERSION_MANAGER_H_ 6 #define QUICHE_QUIC_CORE_QUIC_VERSION_MANAGER_H_ 7 8 #include "quiche/quic/core/quic_versions.h" 9 #include "quiche/quic/platform/api/quic_export.h" 10 11 namespace quic { 12 13 // Used to generate filtered supported versions based on flags. 14 class QUICHE_EXPORT QuicVersionManager { 15 public: 16 // |supported_versions| should be sorted in the order of preference (typically 17 // highest supported version to the lowest supported version). 18 explicit QuicVersionManager(ParsedQuicVersionVector supported_versions); 19 virtual ~QuicVersionManager(); 20 21 // Returns currently supported QUIC versions. This vector has the same order 22 // as the versions passed to the constructor. 23 const ParsedQuicVersionVector& GetSupportedVersions(); 24 25 // Returns currently supported versions using HTTP/3. 26 const ParsedQuicVersionVector& GetSupportedVersionsWithOnlyHttp3(); 27 28 // Returns the list of supported ALPNs, based on the current supported 29 // versions and any custom additions by subclasses. 30 const std::vector<std::string>& GetSupportedAlpns(); 31 32 protected: 33 // If the value of any reloadable flag is different from the cached value, 34 // re-filter |filtered_supported_versions_| and update the cached flag values. 35 // Otherwise, does nothing. 36 // TODO(dschinazi): Make private when deprecating 37 // FLAGS_gfe2_restart_flag_quic_disable_old_alt_svc_format. 38 void MaybeRefilterSupportedVersions(); 39 40 // Refilters filtered_supported_versions_. 41 virtual void RefilterSupportedVersions(); 42 43 // RefilterSupportedVersions() must be called before calling this method. 44 // TODO(dschinazi): Remove when deprecating 45 // FLAGS_gfe2_restart_flag_quic_disable_old_alt_svc_format. filtered_transport_versions()46 const QuicTransportVersionVector& filtered_transport_versions() const { 47 return filtered_transport_versions_; 48 } 49 50 // Subclasses may add custom ALPNs to the supported list by overriding 51 // RefilterSupportedVersions() to first call 52 // QuicVersionManager::RefilterSupportedVersions() then AddCustomAlpn(). 53 // Must not be called elsewhere. 54 void AddCustomAlpn(const std::string& alpn); 55 56 private: 57 // Cached value of reloadable flags. 58 // quic_enable_version_2_draft_08 flag 59 bool enable_version_2_draft_08_ = false; 60 // quic_disable_version_rfcv1 flag 61 bool disable_version_rfcv1_ = true; 62 // quic_disable_version_draft_29 flag 63 bool disable_version_draft_29_ = true; 64 // quic_disable_version_q046 flag 65 bool disable_version_q046_ = true; 66 67 // The list of versions that may be supported. 68 const ParsedQuicVersionVector allowed_supported_versions_; 69 70 // The following vectors are calculated from reloadable flags by 71 // RefilterSupportedVersions(). It is performed lazily when first needed, and 72 // after that, since the calculation is relatively expensive, only if the flag 73 // values change. 74 75 // This vector contains QUIC versions which are currently supported based on 76 // flags. 77 ParsedQuicVersionVector filtered_supported_versions_; 78 // Currently supported versions using HTTP/3. 79 ParsedQuicVersionVector filtered_supported_versions_with_http3_; 80 // This vector contains the transport versions from 81 // |filtered_supported_versions_|. No guarantees are made that the same 82 // transport version isn't repeated. 83 QuicTransportVersionVector filtered_transport_versions_; 84 // Contains the list of ALPNs corresponding to filtered_supported_versions_ 85 // with custom ALPNs added. 86 std::vector<std::string> filtered_supported_alpns_; 87 }; 88 89 } // namespace quic 90 91 #endif // QUICHE_QUIC_CORE_QUIC_VERSION_MANAGER_H_ 92