Merge pull request #268 from spalger/fix/sniffingHttpsNodes

implement config.sniffedNodesProtocol
This commit is contained in:
Spencer
2015-09-12 12:55:42 -07:00
5 changed files with 112 additions and 3 deletions

View File

@ -164,6 +164,10 @@ Defaults:::
* jQuery Build: `"jquery"`
`sniffedNodesProtocol`[[config-sniffed-nodes-protocol]]:: `String` -- Defines the protocol that will be used to communicate with nodes discovered during sniffing.
Default::: If all of the hosts/host passed to the client via configuration use the same protocol then this defaults to that protocol, otherwise it defaults to `"http"`.
`ssl`[[config-ssl]]:: `Object` -- An object defining HTTPS/SSL configuration to use for all nodes. The properties of this mimic the options accepted by http://nodejs.org/docs/latest/api/tls.html#tls_tls_connect_port_host_options_callback[`tls.connect()`] with the exception of `rejectUnauthorized`, which defaults to `false` allowing self-signed certificates to work out-of-the-box.
+

View File

@ -328,6 +328,12 @@ ConnectionPool.prototype.setHosts = function (hosts) {
}
};
ConnectionPool.prototype.getAllHosts = function () {
return _.values(this.index).map(function (connection) {
return connection.host;
});
};
/**
* Close the conncetion pool, as well as all of it's connections
*/

View File

@ -9,6 +9,7 @@ var errors = require('./errors');
var Host = require('./host');
var Promise = require('bluebird');
var patchSniffOnConnectionFault = require('./transport/sniff_on_connection_fault');
var findCommonProtocol = require('./transport/find_common_protocol');
function Transport(config) {
var self = this;
@ -71,6 +72,12 @@ function Transport(config) {
self.connectionPool.setHosts(hosts);
}
if (config.hasOwnProperty('sniffedNodesProtocol')) {
self.sniffedNodesProtocol = config.sniffedNodesProtocol || null;
} else {
self.sniffedNodesProtocol = findCommonProtocol(self.connectionPool.getAllHosts()) || null;
}
if (config.sniffOnStart) {
self.sniff();
}
@ -344,6 +351,7 @@ Transport.prototype.sniff = function (cb) {
var nodesToHostCallback = this.nodesToHostCallback;
var log = this.log;
var globalConfig = this._config;
var sniffedNodesProtocol = this.sniffedNodesProtocol;
// make cb a function if it isn't
cb = typeof cb === 'function' ? cb : _.noop;
@ -364,6 +372,10 @@ Transport.prototype.sniff = function (cb) {
}
connectionPool.setHosts(_.map(hostsConfigs, function (hostConfig) {
if (sniffedNodesProtocol) {
hostConfig.protocol = sniffedNodesProtocol;
}
return new Host(hostConfig, globalConfig);
}));
}

View File

@ -0,0 +1,14 @@
var isEmpty = require('lodash').isEmpty;
module.exports = function (hosts) {
if (isEmpty(hosts)) return false;
var commonProtocol = hosts.shift().protocol;
for (var i = 0; i < hosts.length; i++) {
if (commonProtocol !== hosts[i].protocol) {
return false;
}
}
return commonProtocol;
}

View File

@ -24,6 +24,9 @@ function getConnection(transport, status) {
return transport.connectionPool.getConnections(status || 'alive', 1).pop();
}
function CustomConnectionPool() {}
CustomConnectionPool.prototype = Object.create(Transport.connectionPools.main.prototype);
describe('Transport Class', function () {
describe('Constructor', function () {
@ -37,7 +40,6 @@ describe('Transport Class', function () {
});
it('Accepts a connection pool class and intanciates it at this.connectionPool', function () {
function CustomConnectionPool() {}
var trans = new Transport({
connectionPool: CustomConnectionPool
});
@ -46,7 +48,7 @@ describe('Transport Class', function () {
});
it('Accepts the name of a connectionPool class that is defined on Transport.connectionPools', function () {
Transport.connectionPools.custom = function () {};
Transport.connectionPools.custom = CustomConnectionPool;
var trans = new Transport({
connectionPool: 'custom'
@ -91,6 +93,77 @@ describe('Transport Class', function () {
});
describe('config.sniffedNodesProtocol', function () {
it('Assigns to itself', function () {
var football = {};
var trans = new Transport({
sniffedNodesProtocol: football
});
expect(trans).to.have.property('sniffedNodesProtocol', football);
});
it('Defaults to null when no hosts given', function () {
var trans = new Transport({
hosts: []
});
expect(trans).to.have.property('sniffedNodesProtocol', null);
});
it('Defaults to "http" when a single http host given', function () {
var trans = new Transport({
hosts: [
new Host({
protocol: 'http'
})
]
});
expect(trans).to.have.property('sniffedNodesProtocol', 'http');
});
it('Defaults to "http" when multiple http host given', function () {
var trans = new Transport({
hosts: [
new Host(),
'http://google.com',
{
host: 'foo',
path: 'bar'
}
]
});
expect(trans).to.have.property('sniffedNodesProtocol', 'http');
});
it('Defaults to "https" when a single https host given', function () {
var trans = new Transport({
host: {
protocol: 'https'
}
});
expect(trans).to.have.property('sniffedNodesProtocol', 'https');
});
it('Defaults to "https" when every seed host uses https', function () {
var trans = new Transport({
hosts: [
'https://localhost:9200',
new Host({
protocol: 'https'
}),
{
protocol: 'https'
}
]
});
expect(trans).to.have.property('sniffedNodesProtocol', 'https');
});
})
describe('host config', function () {
it('rejects non-strings/objects', function () {
expect(function () {