in lib/ServiceURI.cc [54:100]
auto ServiceURI::parse(const std::string& uriString) -> DataType {
size_t pos = uriString.find("://");
if (pos == std::string::npos) {
throw std::invalid_argument("The scheme part is missing: " + uriString);
}
if (pos == 0) {
throw std::invalid_argument("Expected scheme name at index 0: " + uriString);
}
const auto scheme = scheme::toScheme(uriString.substr(0, pos));
pos += 3; // now it points to the end of "://"
if (pos < uriString.size() && uriString[pos] == '/') {
throw std::invalid_argument("authority component is missing in service uri: " + uriString);
}
std::vector<std::string> addresses;
while (pos < uriString.size()) {
const size_t endPos = uriString.find(',', pos);
if (endPos == std::string::npos) {
addresses.emplace_back(uriString.substr(pos, endPos - pos));
break;
}
addresses.emplace_back(uriString.substr(pos, endPos - pos));
pos = endPos + 1;
}
bool hasEmptyAddress = false;
for (auto& address : addresses) {
processAddress(address, scheme);
if (address.empty()) {
hasEmptyAddress = true;
}
}
if (hasEmptyAddress) {
auto originalAddresses = addresses;
addresses.clear();
for (const auto& address : originalAddresses) {
if (!address.empty()) {
addresses.emplace_back(address);
}
}
}
if (addresses.empty()) {
throw std::invalid_argument("No service url is provided yet");
}
return std::make_pair(scheme, addresses);
}