tuple get_host_and_port()

in src/main.cpp [56:79]


tuple<string, uint16_t> get_host_and_port(string const & endpoint, uint16_t default_port)
{
    try
    {
        size_t position = endpoint.find(':');
        if (position != string::npos && position != endpoint.length() - 1)
        {
            const string host = endpoint.substr(0, position);
            const string port = endpoint.substr(position + 1, endpoint.length() - (position + 1));
            const auto portnum = static_cast<uint16_t>(stoi(port, &position));
            if (port.length() == 0 || position != port.length()) throw std::invalid_argument("");
            return std::make_tuple(host, portnum);
        }
        else
        {
            if (position == endpoint.length() - 1) throw std::invalid_argument("");
            return std::make_tuple(endpoint, default_port);
        }
    }
    catch (std::invalid_argument &)
    {
        throw std::invalid_argument((boost::format("Invalid endpoint specified: %1%") % endpoint).str());
    }
}