1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "net/base/connection_endpoint_metadata.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include <optional> 8*6777b538SAndroid Build Coastguard Worker #include <string> 9*6777b538SAndroid Build Coastguard Worker #include <utility> 10*6777b538SAndroid Build Coastguard Worker #include <vector> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include "base/base64.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/values.h" 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker namespace net { 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker namespace { 18*6777b538SAndroid Build Coastguard Worker const char kSupportedProtocolAlpnsKey[] = "supported_protocol_alpns"; 19*6777b538SAndroid Build Coastguard Worker const char kEchConfigListKey[] = "ech_config_list"; 20*6777b538SAndroid Build Coastguard Worker const char kTargetNameKey[] = "target_name"; 21*6777b538SAndroid Build Coastguard Worker } // namespace 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker ConnectionEndpointMetadata::ConnectionEndpointMetadata() = default; 24*6777b538SAndroid Build Coastguard Worker ConnectionEndpointMetadata(std::vector<std::string> supported_protocol_alpns,EchConfigList ech_config_list,std::string target_name)25*6777b538SAndroid Build Coastguard WorkerConnectionEndpointMetadata::ConnectionEndpointMetadata( 26*6777b538SAndroid Build Coastguard Worker std::vector<std::string> supported_protocol_alpns, 27*6777b538SAndroid Build Coastguard Worker EchConfigList ech_config_list, 28*6777b538SAndroid Build Coastguard Worker std::string target_name) 29*6777b538SAndroid Build Coastguard Worker : supported_protocol_alpns(std::move(supported_protocol_alpns)), 30*6777b538SAndroid Build Coastguard Worker ech_config_list(std::move(ech_config_list)), 31*6777b538SAndroid Build Coastguard Worker target_name(std::move(target_name)) {} 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker ConnectionEndpointMetadata::~ConnectionEndpointMetadata() = default; 34*6777b538SAndroid Build Coastguard Worker ConnectionEndpointMetadata::ConnectionEndpointMetadata( 35*6777b538SAndroid Build Coastguard Worker const ConnectionEndpointMetadata&) = default; 36*6777b538SAndroid Build Coastguard Worker ConnectionEndpointMetadata::ConnectionEndpointMetadata( 37*6777b538SAndroid Build Coastguard Worker ConnectionEndpointMetadata&&) = default; 38*6777b538SAndroid Build Coastguard Worker ToValue() const39*6777b538SAndroid Build Coastguard Workerbase::Value ConnectionEndpointMetadata::ToValue() const { 40*6777b538SAndroid Build Coastguard Worker base::Value::Dict dict; 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker base::Value::List alpns_list; 43*6777b538SAndroid Build Coastguard Worker for (const std::string& alpn : supported_protocol_alpns) { 44*6777b538SAndroid Build Coastguard Worker alpns_list.Append(alpn); 45*6777b538SAndroid Build Coastguard Worker } 46*6777b538SAndroid Build Coastguard Worker dict.Set(kSupportedProtocolAlpnsKey, std::move(alpns_list)); 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker dict.Set(kEchConfigListKey, base::Base64Encode(ech_config_list)); 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker if (!target_name.empty()) { 51*6777b538SAndroid Build Coastguard Worker dict.Set(kTargetNameKey, target_name); 52*6777b538SAndroid Build Coastguard Worker } 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker return base::Value(std::move(dict)); 55*6777b538SAndroid Build Coastguard Worker } 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker // static FromValue(const base::Value & value)58*6777b538SAndroid Build Coastguard Workerstd::optional<ConnectionEndpointMetadata> ConnectionEndpointMetadata::FromValue( 59*6777b538SAndroid Build Coastguard Worker const base::Value& value) { 60*6777b538SAndroid Build Coastguard Worker const base::Value::Dict* dict = value.GetIfDict(); 61*6777b538SAndroid Build Coastguard Worker if (!dict) 62*6777b538SAndroid Build Coastguard Worker return std::nullopt; 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard Worker const base::Value::List* alpns_list = 65*6777b538SAndroid Build Coastguard Worker dict->FindList(kSupportedProtocolAlpnsKey); 66*6777b538SAndroid Build Coastguard Worker const std::string* ech_config_list_value = 67*6777b538SAndroid Build Coastguard Worker dict->FindString(kEchConfigListKey); 68*6777b538SAndroid Build Coastguard Worker const std::string* target_name_value = dict->FindString(kTargetNameKey); 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker if (!alpns_list || !ech_config_list_value) 71*6777b538SAndroid Build Coastguard Worker return std::nullopt; 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker ConnectionEndpointMetadata metadata; 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker std::vector<std::string> alpns; 76*6777b538SAndroid Build Coastguard Worker for (const base::Value& alpn : *alpns_list) { 77*6777b538SAndroid Build Coastguard Worker if (!alpn.is_string()) 78*6777b538SAndroid Build Coastguard Worker return std::nullopt; 79*6777b538SAndroid Build Coastguard Worker metadata.supported_protocol_alpns.push_back(alpn.GetString()); 80*6777b538SAndroid Build Coastguard Worker } 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker std::optional<std::vector<uint8_t>> decoded = 83*6777b538SAndroid Build Coastguard Worker base::Base64Decode(*ech_config_list_value); 84*6777b538SAndroid Build Coastguard Worker if (!decoded) 85*6777b538SAndroid Build Coastguard Worker return std::nullopt; 86*6777b538SAndroid Build Coastguard Worker metadata.ech_config_list = std::move(*decoded); 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Worker if (target_name_value) { 89*6777b538SAndroid Build Coastguard Worker metadata.target_name = *target_name_value; 90*6777b538SAndroid Build Coastguard Worker } 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker return metadata; 93*6777b538SAndroid Build Coastguard Worker } 94*6777b538SAndroid Build Coastguard Worker 95*6777b538SAndroid Build Coastguard Worker } // namespace net 96