diff options
Diffstat (limited to 'src/mongo/util/net/hostandport.cpp')
-rw-r--r-- | src/mongo/util/net/hostandport.cpp | 213 |
1 files changed, 103 insertions, 110 deletions
diff --git a/src/mongo/util/net/hostandport.cpp b/src/mongo/util/net/hostandport.cpp index 8d906c91264..a803af640fb 100644 --- a/src/mongo/util/net/hostandport.cpp +++ b/src/mongo/util/net/hostandport.cpp @@ -41,141 +41,134 @@ namespace mongo { - StatusWith<HostAndPort> HostAndPort::parse(const StringData& text) { - HostAndPort result; - Status status = result.initialize(text); - if (!status.isOK()) { - return StatusWith<HostAndPort>(status); - } - return StatusWith<HostAndPort>(result); +StatusWith<HostAndPort> HostAndPort::parse(const StringData& text) { + HostAndPort result; + Status status = result.initialize(text); + if (!status.isOK()) { + return StatusWith<HostAndPort>(status); } + return StatusWith<HostAndPort>(result); +} - HostAndPort::HostAndPort() : _port(-1) {} +HostAndPort::HostAndPort() : _port(-1) {} - HostAndPort::HostAndPort(const StringData& text) { - uassertStatusOK(initialize(text)); - } +HostAndPort::HostAndPort(const StringData& text) { + uassertStatusOK(initialize(text)); +} - HostAndPort::HostAndPort(const std::string& h, int p) : _host(h), _port(p) {} +HostAndPort::HostAndPort(const std::string& h, int p) : _host(h), _port(p) {} - bool HostAndPort::operator<(const HostAndPort& r) const { - const int cmp = host().compare(r.host()); - if (cmp) - return cmp < 0; - return port() < r.port(); - } +bool HostAndPort::operator<(const HostAndPort& r) const { + const int cmp = host().compare(r.host()); + if (cmp) + return cmp < 0; + return port() < r.port(); +} - bool HostAndPort::operator==(const HostAndPort& r) const { - return host() == r.host() && port() == r.port(); - } +bool HostAndPort::operator==(const HostAndPort& r) const { + return host() == r.host() && port() == r.port(); +} - int HostAndPort::port() const { - if (hasPort()) - return _port; - return ServerGlobalParams::DefaultDBPort; - } +int HostAndPort::port() const { + if (hasPort()) + return _port; + return ServerGlobalParams::DefaultDBPort; +} - bool HostAndPort::isLocalHost() const { - return ( _host == "localhost" - || str::startsWith(_host.c_str(), "127.") - || _host == "::1" - || _host == "anonymous unix socket" - || _host.c_str()[0] == '/' // unix socket - ); - } +bool HostAndPort::isLocalHost() const { + return (_host == "localhost" || str::startsWith(_host.c_str(), "127.") || _host == "::1" || + _host == "anonymous unix socket" || _host.c_str()[0] == '/' // unix socket + ); +} - std::string HostAndPort::toString() const { - StringBuilder ss; - append( ss ); - return ss.str(); - } +std::string HostAndPort::toString() const { + StringBuilder ss; + append(ss); + return ss.str(); +} - void HostAndPort::append(StringBuilder& ss) const { - // wrap ipv6 addresses in []s for roundtrip-ability - if (host().find(':') != std::string::npos) { - ss << '[' << host() << ']'; - } - else { - ss << host(); - } - ss << ':' << port(); +void HostAndPort::append(StringBuilder& ss) const { + // wrap ipv6 addresses in []s for roundtrip-ability + if (host().find(':') != std::string::npos) { + ss << '[' << host() << ']'; + } else { + ss << host(); } + ss << ':' << port(); +} - bool HostAndPort::empty() const { - return _host.empty() && _port < 0; - } +bool HostAndPort::empty() const { + return _host.empty() && _port < 0; +} - Status HostAndPort::initialize(const StringData& s) { - size_t colonPos = s.rfind(':'); - StringData hostPart = s.substr(0, colonPos); - - // handle ipv6 hostPart (which we require to be wrapped in []s) - const size_t openBracketPos = s.find('['); - const size_t closeBracketPos = s.find(']'); - if (openBracketPos != std::string::npos) { - if (openBracketPos != 0) { - return Status(ErrorCodes::FailedToParse, - str::stream() << "'[' present, but not first character in " - << s.toString()); - } - if (closeBracketPos == std::string::npos) { - return Status(ErrorCodes::FailedToParse, - str::stream() << "ipv6 address is missing closing ']' in hostname in " - << s.toString()); - } - - hostPart = s.substr(openBracketPos+1, closeBracketPos-openBracketPos-1); - // prevent accidental assignment of port to the value of the final portion of hostPart - if (colonPos < closeBracketPos) { - colonPos = std::string::npos; - } - else if (colonPos != closeBracketPos+1) { - return Status(ErrorCodes::FailedToParse, - str::stream() << "Extraneous characters between ']' and pre-port ':'" - << " in " << s.toString()); - } - } - else if (closeBracketPos != std::string::npos) { +Status HostAndPort::initialize(const StringData& s) { + size_t colonPos = s.rfind(':'); + StringData hostPart = s.substr(0, colonPos); + + // handle ipv6 hostPart (which we require to be wrapped in []s) + const size_t openBracketPos = s.find('['); + const size_t closeBracketPos = s.find(']'); + if (openBracketPos != std::string::npos) { + if (openBracketPos != 0) { return Status(ErrorCodes::FailedToParse, - str::stream() << "']' present without '[' in " << s.toString()); + str::stream() << "'[' present, but not first character in " + << s.toString()); } - else if (s.find(':') != colonPos) { + if (closeBracketPos == std::string::npos) { return Status(ErrorCodes::FailedToParse, - str::stream() << "More than one ':' detected. If this is an ipv6 address," - << " it needs to be surrounded by '[' and ']'; " + str::stream() << "ipv6 address is missing closing ']' in hostname in " << s.toString()); } - if (hostPart.empty()) { - return Status(ErrorCodes::FailedToParse, str::stream() << - "Empty host component parsing HostAndPort from \"" << - escape(s.toString()) << "\""); + hostPart = s.substr(openBracketPos + 1, closeBracketPos - openBracketPos - 1); + // prevent accidental assignment of port to the value of the final portion of hostPart + if (colonPos < closeBracketPos) { + colonPos = std::string::npos; + } else if (colonPos != closeBracketPos + 1) { + return Status(ErrorCodes::FailedToParse, + str::stream() << "Extraneous characters between ']' and pre-port ':'" + << " in " << s.toString()); } + } else if (closeBracketPos != std::string::npos) { + return Status(ErrorCodes::FailedToParse, + str::stream() << "']' present without '[' in " << s.toString()); + } else if (s.find(':') != colonPos) { + return Status(ErrorCodes::FailedToParse, + str::stream() << "More than one ':' detected. If this is an ipv6 address," + << " it needs to be surrounded by '[' and ']'; " + << s.toString()); + } + + if (hostPart.empty()) { + return Status(ErrorCodes::FailedToParse, + str::stream() << "Empty host component parsing HostAndPort from \"" + << escape(s.toString()) << "\""); + } - int port; - if (colonPos != std::string::npos) { - const StringData portPart = s.substr(colonPos + 1); - Status status = parseNumberFromStringWithBase(portPart, 10, &port); - if (!status.isOK()) { - return status; - } - if (port <= 0) { - return Status(ErrorCodes::FailedToParse, str::stream() << "Port number " << port << - " out of range parsing HostAndPort from \"" << escape(s.toString()) << - "\""); - } + int port; + if (colonPos != std::string::npos) { + const StringData portPart = s.substr(colonPos + 1); + Status status = parseNumberFromStringWithBase(portPart, 10, &port); + if (!status.isOK()) { + return status; } - else { - port = -1; + if (port <= 0) { + return Status(ErrorCodes::FailedToParse, + str::stream() << "Port number " << port + << " out of range parsing HostAndPort from \"" + << escape(s.toString()) << "\""); } - _host = hostPart.toString(); - _port = port; - return Status::OK(); + } else { + port = -1; } + _host = hostPart.toString(); + _port = port; + return Status::OK(); +} - std::ostream& operator<<(std::ostream& os, const HostAndPort& hp) { - return os << hp.toString(); - } +std::ostream& operator<<(std::ostream& os, const HostAndPort& hp) { + return os << hp.toString(); +} } // namespace mongo |