diff options
author | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2016-02-17 17:33:44 -0500 |
---|---|---|
committer | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2016-02-18 10:52:40 -0500 |
commit | 21c2bb6641f863a8569a9496b9d92aeef2a6bca3 (patch) | |
tree | f9563e02d9826620ac4cb73be3de7e555ff241a4 /src/mongo/client | |
parent | 9b3ce6e9fbcefff128189a1ad7259d848203b8ed (diff) | |
download | mongo-21c2bb6641f863a8569a9496b9d92aeef2a6bca3.tar.gz |
SERVER-22714 MongoURI should use the socketTimeout option
Diffstat (limited to 'src/mongo/client')
-rw-r--r-- | src/mongo/client/mongo_uri.cpp | 10 | ||||
-rw-r--r-- | src/mongo/client/mongo_uri.h | 22 | ||||
-rw-r--r-- | src/mongo/client/mongo_uri_connect.cpp | 43 |
3 files changed, 45 insertions, 30 deletions
diff --git a/src/mongo/client/mongo_uri.cpp b/src/mongo/client/mongo_uri.cpp index 443a35f9858..6a11c2cace4 100644 --- a/src/mongo/client/mongo_uri.cpp +++ b/src/mongo/client/mongo_uri.cpp @@ -114,7 +114,7 @@ StatusWith<MongoURI> MongoURI::parse(const std::string& url) { std::string(optionsTokens[i + 1].begin(), optionsTokens[i + 1].end()); } - std::map<std::string, std::string>::const_iterator optIter; + OptionsMap::const_iterator optIter; // If a replica set option was specified, store it in the 'setName' field. bool haveSetName; @@ -122,11 +122,6 @@ StatusWith<MongoURI> MongoURI::parse(const std::string& url) { if ((haveSetName = ((optIter = options.find("replicaSet")) != options.end()))) setName = optIter->second; - // Add all remaining options into the bson object - BSONObjBuilder optionsBob; - for (optIter = options.begin(); optIter != options.end(); ++optIter) - optionsBob.append(optIter->first, optIter->second); - std::string servers_str = matches[3].str(); std::vector<HostAndPort> servers; std::vector<std::string> servers_split; @@ -148,7 +143,8 @@ StatusWith<MongoURI> MongoURI::parse(const std::string& url) { ConnectionString cs( direct ? ConnectionString::MASTER : ConnectionString::SET, servers, setName); - return MongoURI(cs, matches[1].str(), matches[2].str(), matches[4].str(), optionsBob.obj()); + return MongoURI( + std::move(cs), matches[1].str(), matches[2].str(), matches[4].str(), std::move(options)); } } // namespace mongo diff --git a/src/mongo/client/mongo_uri.h b/src/mongo/client/mongo_uri.h index bc051f24e5d..f9c36163ab4 100644 --- a/src/mongo/client/mongo_uri.h +++ b/src/mongo/client/mongo_uri.h @@ -28,6 +28,7 @@ #pragma once +#include <map> #include <string> #include <vector> @@ -67,9 +68,11 @@ namespace mongo { */ class MongoURI { public: + using OptionsMap = std::map<std::string, std::string>; + static StatusWith<MongoURI> parse(const std::string& url); - DBClientBase* connect(std::string& errmsg, double socketTimeout = 0) const; + DBClientBase* connect(std::string& errmsg) const; const std::string& getUser() const { return _user; @@ -79,7 +82,7 @@ public: return _password; } - const BSONObj& getOptions() const { + const OptionsMap& getOptions() const { return _options; } @@ -108,19 +111,19 @@ public: } private: - explicit MongoURI(const ConnectionString cs) - : _connectString(std::move(cs)), _user(), _password(), _database(), _options(){}; + explicit MongoURI(const ConnectionString connectString) + : _connectString(std::move(connectString)){}; - MongoURI(ConnectionString _connectString, + MongoURI(ConnectionString connectString, const std::string& user, const std::string& password, const std::string& database, - const BSONObj& options) - : _connectString(std::move(_connectString)), + OptionsMap options) + : _connectString(std::move(connectString)), _user(user), _password(password), _database(database), - _options(options){}; + _options(std::move(options)){}; BSONObj _makeAuthObjFromOptions(int maxWireVersion) const; @@ -128,6 +131,7 @@ private: std::string _user; std::string _password; std::string _database; - BSONObj _options; + OptionsMap _options; }; + } // namespace mongo diff --git a/src/mongo/client/mongo_uri_connect.cpp b/src/mongo/client/mongo_uri_connect.cpp index aaee6d2bcc2..7918cacb93f 100644 --- a/src/mongo/client/mongo_uri_connect.cpp +++ b/src/mongo/client/mongo_uri_connect.cpp @@ -111,34 +111,36 @@ BSONObj MongoURI::_makeAuthObjFromOptions(int maxWireVersion) const { if (!_password.empty()) bob.append(saslCommandPasswordFieldName, _password); - BSONElement elt = _options.getField("authSource"); - if (!elt.eoo()) { - bob.appendAs(elt, saslCommandUserDBFieldName); + OptionsMap::const_iterator it; + + it = _options.find("authSource"); + if (it != _options.end()) { + bob.append(saslCommandUserDBFieldName, it->second); } else if (!_database.empty()) { bob.append(saslCommandUserDBFieldName, _database); } else { bob.append(saslCommandUserDBFieldName, "admin"); } - elt = _options.getField("authMechanism"); - if (!elt.eoo()) { - bob.appendAs(elt, saslCommandMechanismFieldName); + it = _options.find("authMechanism"); + if (it != _options.end()) { + bob.append(saslCommandMechanismFieldName, it->second); } else if (maxWireVersion >= 3) { bob.append(saslCommandMechanismFieldName, kAuthMechScramSha1); } else { bob.append(saslCommandMechanismFieldName, kAuthMechMongoCR); } - elt = _options.getField("authMechanismProperties"); - if (!elt.eoo()) { - BSONObj parsed(parseAuthMechanismProperties(elt.String())); + it = _options.find("authMechanismProperties"); + if (it != _options.end()) { + BSONObj parsed(parseAuthMechanismProperties(it->second)); bool hasNameProp = parsed.hasField(kAuthServiceName); bool hasRealmProp = parsed.hasField(kAuthServiceRealm); uassert(ErrorCodes::FailedToParse, "Cannot specify both gssapiServiceName and SERVICE_NAME", - !(hasNameProp && _options.hasField("gssapiServiceName"))); + !(hasNameProp && _options.count("gssapiServiceName"))); // we append the parsed object so that mechanisms that don't accept it can assert. bob.append(kAuthMechanismPropertiesKey, parsed); // we still append using the old way the SASL code expects it @@ -152,16 +154,29 @@ BSONObj MongoURI::_makeAuthObjFromOptions(int maxWireVersion) const { } } - elt = _options.getField("gssapiServiceName"); - if (!elt.eoo()) - bob.appendAs(elt, saslCommandServiceNameFieldName); + it = _options.find("gssapiServiceName"); + if (it != _options.end()) { + bob.append(saslCommandServiceNameFieldName, it->second); + } bob.append("user", username); return bob.obj(); } -DBClientBase* MongoURI::connect(std::string& errmsg, double socketTimeout) const { +DBClientBase* MongoURI::connect(std::string& errmsg) const { + double socketTimeout = 0.0; + + OptionsMap::const_iterator it = _options.find("socketTimeoutMS"); + if (it != _options.end()) { + try { + socketTimeout = std::stod(it->second); + } catch (const std::exception& e) { + uasserted(ErrorCodes::BadValue, + str::stream() << "Unable to parse socketTimeoutMS value" << causedBy(e)); + } + } + auto ret = _connectString.connect(errmsg, socketTimeout); if (!_user.empty()) { ret->auth(_makeAuthObjFromOptions(ret->getMaxWireVersion())); |