xref: /aosp_15_r20/external/cronet/net/dns/https_record_rdata.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2020 The Chromium Authors
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 NET_DNS_HTTPS_RECORD_RDATA_H_
6 #define NET_DNS_HTTPS_RECORD_RDATA_H_
7 
8 #include <stdint.h>
9 
10 #include <map>
11 #include <memory>
12 #include <optional>
13 #include <set>
14 #include <string>
15 #include <string_view>
16 #include <vector>
17 
18 #include "net/base/ip_address.h"
19 #include "net/base/net_export.h"
20 #include "net/dns/public/dns_protocol.h"
21 #include "net/dns/record_rdata.h"
22 
23 namespace net {
24 
25 using HttpsRecordPriority = uint16_t;
26 
27 class AliasFormHttpsRecordRdata;
28 class ServiceFormHttpsRecordRdata;
29 
30 class NET_EXPORT_PRIVATE HttpsRecordRdata : public RecordRdata {
31  public:
32   static const uint16_t kType = dns_protocol::kTypeHttps;
33 
34   // Returns `nullptr` on malformed input.
35   static std::unique_ptr<HttpsRecordRdata> Parse(std::string_view data);
36 
37   HttpsRecordRdata(const HttpsRecordRdata& rdata) = delete;
38   HttpsRecordRdata& operator=(const HttpsRecordRdata& rdata) = delete;
39 
40   ~HttpsRecordRdata() override;
41 
42   bool IsEqual(const RecordRdata* other) const override;
43   virtual bool IsEqual(const HttpsRecordRdata* other) const = 0;
44   uint16_t Type() const override;
45 
46   virtual bool IsAlias() const = 0;
47   AliasFormHttpsRecordRdata* AsAliasForm();
48   const AliasFormHttpsRecordRdata* AsAliasForm() const;
49   ServiceFormHttpsRecordRdata* AsServiceForm();
50   const ServiceFormHttpsRecordRdata* AsServiceForm() const;
51 
52  protected:
53   HttpsRecordRdata() = default;
54 };
55 
56 class NET_EXPORT_PRIVATE AliasFormHttpsRecordRdata : public HttpsRecordRdata {
57  public:
58   explicit AliasFormHttpsRecordRdata(std::string alias_name);
59   static std::unique_ptr<AliasFormHttpsRecordRdata> Parse(
60       std::string_view data);
61 
62   bool IsEqual(const HttpsRecordRdata* other) const override;
63   bool IsAlias() const override;
64 
alias_name()65   std::string_view alias_name() const { return alias_name_; }
66 
67  private:
68   AliasFormHttpsRecordRdata() = default;
69 
70   const std::string alias_name_;
71 };
72 
73 class NET_EXPORT_PRIVATE ServiceFormHttpsRecordRdata : public HttpsRecordRdata {
74  public:
75   static constexpr uint16_t kSupportedKeys[] = {
76       dns_protocol::kHttpsServiceParamKeyMandatory,
77       dns_protocol::kHttpsServiceParamKeyAlpn,
78       dns_protocol::kHttpsServiceParamKeyNoDefaultAlpn,
79       dns_protocol::kHttpsServiceParamKeyPort,
80       dns_protocol::kHttpsServiceParamKeyIpv4Hint,
81       dns_protocol::kHttpsServiceParamKeyEchConfig,
82       dns_protocol::kHttpsServiceParamKeyIpv6Hint};
83 
84   ServiceFormHttpsRecordRdata(uint16_t priority,
85                               std::string service_name,
86                               std::set<uint16_t> mandatory_keys,
87                               std::vector<std::string> alpn_ids,
88                               bool default_alpn,
89                               std::optional<uint16_t> port,
90                               std::vector<IPAddress> ipv4_hint,
91                               std::string ech_config,
92                               std::vector<IPAddress> ipv6_hint,
93                               std::map<uint16_t, std::string> unparsed_params);
94   static std::unique_ptr<ServiceFormHttpsRecordRdata> Parse(
95       std::string_view data);
96 
97   ~ServiceFormHttpsRecordRdata() override;
98 
99   bool IsEqual(const HttpsRecordRdata* other) const override;
100   bool IsAlias() const override;
101 
priority()102   HttpsRecordPriority priority() const { return priority_; }
service_name()103   std::string_view service_name() const { return service_name_; }
mandatory_keys()104   const std::set<uint16_t>& mandatory_keys() const { return mandatory_keys_; }
alpn_ids()105   const std::vector<std::string>& alpn_ids() const { return alpn_ids_; }
default_alpn()106   bool default_alpn() const { return default_alpn_; }
port()107   std::optional<uint16_t> port() const { return port_; }
ipv4_hint()108   const std::vector<IPAddress>& ipv4_hint() const { return ipv4_hint_; }
ech_config()109   std::string_view ech_config() const { return ech_config_; }
ipv6_hint()110   const std::vector<IPAddress>& ipv6_hint() const { return ipv6_hint_; }
unparsed_params()111   const std::map<uint16_t, std::string>& unparsed_params() const {
112     return unparsed_params_;
113   }
114 
115   // Returns whether or not this rdata parser is considered "compatible" with
116   // the parsed rdata. That is that all keys listed by mandatory_keys() (and all
117   // keys considered default mandatory for HTTPS records) are parsable by this
118   // parser.
119   bool IsCompatible() const;
120 
121  private:
122   static bool IsSupportedKey(uint16_t key);
123 
124   const HttpsRecordPriority priority_;
125   const std::string service_name_;
126 
127   // Supported service parameters.
128   const std::set<uint16_t> mandatory_keys_;
129   const std::vector<std::string> alpn_ids_;
130   const bool default_alpn_;
131   const std::optional<uint16_t> port_;
132   const std::vector<IPAddress> ipv4_hint_;
133   const std::string ech_config_;
134   const std::vector<IPAddress> ipv6_hint_;
135 
136   const std::map<uint16_t, std::string> unparsed_params_;
137 };
138 
139 }  // namespace net
140 
141 #endif  // NET_DNS_HTTPS_RECORD_RDATA_H_
142