summaryrefslogtreecommitdiff
path: root/src/mongo/util/net/hostandport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/util/net/hostandport.cpp')
-rw-r--r--src/mongo/util/net/hostandport.cpp213
1 files changed, 103 insertions, 110 deletions
diff --git a/src/mongo/util/net/hostandport.cpp b/src/mongo/util/net/hostandport.cpp
index 25455bd7b6f..ea1d0f93467 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(StringData text) {
- HostAndPort result;
- Status status = result.initialize(text);
- if (!status.isOK()) {
- return StatusWith<HostAndPort>(status);
- }
- return StatusWith<HostAndPort>(result);
+StatusWith<HostAndPort> HostAndPort::parse(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(StringData text) {
- uassertStatusOK(initialize(text));
- }
+HostAndPort::HostAndPort(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(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(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