90 std::string_view udp_url) {
91 std::unique_ptr<UdpOptions> options(
new UdpOptions);
93 const size_t question_mark_pos = udp_url.find(
'?');
94 std::string_view address_str = udp_url.substr(0, question_mark_pos);
96 if (question_mark_pos != std::string_view::npos) {
97 std::string_view options_str = udp_url.substr(question_mark_pos + 1);
98 std::vector<KVPair> kv_pairs = SplitStringIntoKeyValuePairs(options_str);
100 for (
const auto& pair : kv_pairs) {
101 switch (GetFieldType(pair.first)) {
102 case kBufferSizeField:
103 if (!absl::SimpleAtoi(pair.second, &options->buffer_size_)) {
104 LOG(ERROR) <<
"Invalid udp option for buffer_size field "
109 case kInterfaceAddressField:
110 options->interface_address_ = pair.second;
112 case kMulticastSourceField:
113 options->source_address_ = pair.second;
114 options->is_source_specific_multicast_ =
true;
118 if (!absl::SimpleAtoi(pair.second, &reuse_value)) {
119 LOG(ERROR) <<
"Invalid udp option for reuse field " << pair.second;
122 options->reuse_ = reuse_value > 0;
126 if (!absl::SimpleAtoi(pair.second, &options->timeout_us_)) {
127 LOG(ERROR) <<
"Invalid udp option for timeout field "
133 LOG(ERROR) <<
"Unknown field in udp options (\"" << pair.first
140 if (!absl::GetFlag(FLAGS_udp_interface_address).empty()) {
141 LOG(WARNING) <<
"--udp_interface_address is deprecated. Consider switching "
142 "to udp options instead, something like "
143 "udp:://ip:port?interface=interface_ip.";
144 options->interface_address_ = absl::GetFlag(FLAGS_udp_interface_address);
147 if (!StringToAddressAndPort(address_str, &options->address_,
149 LOG(ERROR) <<
"Malformed address:port UDP url " << address_str;