HTTPSSVC.h (4822B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #ifndef HTTPSSVC_h__ 6 #define HTTPSSVC_h__ 7 8 #include "nsIDNSByTypeRecord.h" 9 #include "mozilla/net/DNS.h" 10 #include "mozilla/Variant.h" 11 #include "mozilla/Maybe.h" 12 #include "nsHttp.h" 13 14 namespace mozilla { 15 namespace net { 16 17 class DNSHTTPSSVCRecordBase; 18 19 enum SvcParamKey : uint16_t { 20 SvcParamKeyMandatory = 0, 21 SvcParamKeyAlpn = 1, 22 SvcParamKeyNoDefaultAlpn = 2, 23 SvcParamKeyPort = 3, 24 SvcParamKeyIpv4Hint = 4, 25 SvcParamKeyEchConfig = 5, 26 SvcParamKeyIpv6Hint = 6, 27 SvcParamKeyODoHConfig = 32769, 28 }; 29 30 inline bool IsValidSvcParamKey(uint16_t aKey) { 31 return aKey <= SvcParamKeyIpv6Hint || aKey == SvcParamKeyODoHConfig; 32 } 33 34 struct SvcParamAlpn { 35 bool operator==(const SvcParamAlpn& aOther) const { 36 return mValue == aOther.mValue; 37 } 38 CopyableTArray<nsCString> mValue; 39 }; 40 41 struct SvcParamNoDefaultAlpn { 42 bool operator==(const SvcParamNoDefaultAlpn& aOther) const { return true; } 43 }; 44 45 struct SvcParamPort { 46 bool operator==(const SvcParamPort& aOther) const { 47 return mValue == aOther.mValue; 48 } 49 uint16_t mValue; 50 }; 51 52 struct SvcParamIpv4Hint { 53 bool operator==(const SvcParamIpv4Hint& aOther) const { 54 return mValue == aOther.mValue; 55 } 56 CopyableTArray<mozilla::net::NetAddr> mValue; 57 }; 58 59 struct SvcParamEchConfig { 60 bool operator==(const SvcParamEchConfig& aOther) const { 61 return mValue == aOther.mValue; 62 } 63 nsCString mValue; 64 }; 65 66 struct SvcParamIpv6Hint { 67 bool operator==(const SvcParamIpv6Hint& aOther) const { 68 return mValue == aOther.mValue; 69 } 70 CopyableTArray<mozilla::net::NetAddr> mValue; 71 }; 72 73 struct SvcParamODoHConfig { 74 bool operator==(const SvcParamODoHConfig& aOther) const { 75 return mValue == aOther.mValue; 76 } 77 nsCString mValue; 78 }; 79 80 using SvcParamType = 81 mozilla::Variant<Nothing, SvcParamAlpn, SvcParamNoDefaultAlpn, SvcParamPort, 82 SvcParamIpv4Hint, SvcParamEchConfig, SvcParamIpv6Hint, 83 SvcParamODoHConfig>; 84 85 struct SvcFieldValue { 86 bool operator==(const SvcFieldValue& aOther) const { 87 return mValue == aOther.mValue; 88 } 89 SvcFieldValue() : mValue(AsVariant(Nothing{})) {} 90 SvcParamType mValue; 91 }; 92 93 struct SVCB { 94 bool operator==(const SVCB& aOther) const { 95 return mSvcFieldPriority == aOther.mSvcFieldPriority && 96 mSvcDomainName == aOther.mSvcDomainName && 97 mSvcFieldValue == aOther.mSvcFieldValue; 98 } 99 bool operator<(const SVCB& aOther) const; 100 Maybe<uint16_t> GetPort() const; 101 bool NoDefaultAlpn() const; 102 void GetIPHints(CopyableTArray<mozilla::net::NetAddr>& aAddresses) const; 103 nsTArray<std::tuple<nsCString, SupportedAlpnRank>> GetAllAlpn( 104 bool& aHasNoDefaultAlpn) const; 105 uint16_t mSvcFieldPriority = 0; 106 nsCString mSvcDomainName; 107 nsCString mEchConfig; 108 nsCString mODoHConfig; 109 bool mHasIPHints = false; 110 bool mHasEchConfig = false; 111 CopyableTArray<SvcFieldValue> mSvcFieldValue; 112 }; 113 114 struct SVCBWrapper { 115 explicit SVCBWrapper(const SVCB& aRecord) : mRecord(aRecord) {} 116 Maybe<std::tuple<nsCString, SupportedAlpnRank>> mAlpn; 117 const SVCB& mRecord; 118 }; 119 120 class SVCBRecord : public nsISVCBRecord { 121 NS_DECL_THREADSAFE_ISUPPORTS 122 NS_DECL_NSISVCBRECORD 123 public: 124 explicit SVCBRecord(const SVCB& data) 125 : mData(data), mPort(Nothing()), mAlpn(Nothing()) {} 126 explicit SVCBRecord(const SVCB& data, 127 Maybe<std::tuple<nsCString, SupportedAlpnRank>> aAlpn); 128 129 private: 130 friend class DNSHTTPSSVCRecordBase; 131 132 virtual ~SVCBRecord() = default; 133 134 SVCB mData; 135 Maybe<uint16_t> mPort; 136 Maybe<std::tuple<nsCString, SupportedAlpnRank>> mAlpn; 137 }; 138 139 class DNSHTTPSSVCRecordBase { 140 public: 141 explicit DNSHTTPSSVCRecordBase(const nsACString& aHost) : mHost(aHost) {} 142 143 protected: 144 virtual ~DNSHTTPSSVCRecordBase() = default; 145 146 already_AddRefed<nsISVCBRecord> GetServiceModeRecordInternal( 147 bool aNoHttp2, bool aNoHttp3, const nsTArray<SVCB>& aRecords, 148 bool& aRecordsAllExcluded, bool aCheckHttp3ExcludedList, 149 const nsACString& aCname); 150 151 bool HasIPAddressesInternal(const nsTArray<SVCB>& aRecords); 152 153 void GetAllRecordsInternal(bool aNoHttp2, bool aNoHttp3, 154 const nsACString& aCname, 155 const nsTArray<SVCB>& aRecords, 156 bool aOnlyRecordsWithECH, 157 bool* aAllRecordsHaveEchConfig, 158 bool* aAllRecordsInH3ExcludedList, 159 nsTArray<RefPtr<nsISVCBRecord>>& aResult, 160 bool aCheckHttp3ExcludedList = true); 161 162 // The owner name of this HTTPS RR. 163 nsCString mHost; 164 }; 165 166 } // namespace net 167 } // namespace mozilla 168 169 #endif // HTTPSSVC_h__