summaryrefslogtreecommitdiff
path: root/src/mongo/client
diff options
context:
space:
mode:
authorKaloian Manassiev <kaloian.manassiev@mongodb.com>2016-02-17 17:33:44 -0500
committerKaloian Manassiev <kaloian.manassiev@mongodb.com>2016-02-18 10:52:40 -0500
commit21c2bb6641f863a8569a9496b9d92aeef2a6bca3 (patch)
treef9563e02d9826620ac4cb73be3de7e555ff241a4 /src/mongo/client
parent9b3ce6e9fbcefff128189a1ad7259d848203b8ed (diff)
downloadmongo-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.cpp10
-rw-r--r--src/mongo/client/mongo_uri.h22
-rw-r--r--src/mongo/client/mongo_uri_connect.cpp43
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()));