diff --git a/lib/db/index.js b/lib/db/index.js index bf3dbe81..7e1214ae 100644 --- a/lib/db/index.js +++ b/lib/db/index.js @@ -13,13 +13,12 @@ function connect() { var options = { // These environment variables are exposed when we --link to a // RethinkDB container. - host: process.env.RETHINKDB_PORT_28015_TCP_ADDR || '127.0.0.1' - , port: process.env.RETHINKDB_PORT_28015_TCP_PORT || 28015 + url: process.env.RETHINKDB_PORT_28015_TCP || 'tcp://127.0.0.1:28015' , db: process.env.RETHINKDB_ENV_DATABASE || 'stf' , authKey: process.env.RETHINKDB_ENV_AUTHKEY } - return srv.resolve(options.host, options.port) + return srv.resolve(options.url) .then(function(records) { function next() { var record = records.shift() diff --git a/lib/util/srv.js b/lib/util/srv.js index 2a3d1ea7..cd49379f 100644 --- a/lib/util/srv.js +++ b/lib/util/srv.js @@ -1,3 +1,6 @@ +var url = require('url') +var util = require('util') + var Promise = require('bluebird') var dns = Promise.promisifyAll(require('dns')) @@ -58,22 +61,39 @@ function flatten(groupedRecords) { }, []) } -var RE_SRV = /^srv:(.*)$/ - module.exports.sort = function(records) { return flatten(groupByPriority(records).map(shuffleWeighted)) } -module.exports.resolve = function(domain, defaultPort) { - var match - if ((match = RE_SRV.exec(domain))) { - return dns.resolveSrvAsync(match[1]) +module.exports.resolve = function(domain) { + var parsedUrl = url.parse(domain) + + if (!parsedUrl.protocol) { + return Promise.reject(new Error( + 'Must include protocol in "%s"' + , domain + )) + } + + if (/^srv\+/.test(parsedUrl.protocol)) { + parsedUrl.protocol = parsedUrl.protocol.substr(4) + return dns.resolveSrvAsync(parsedUrl.hostname) .then(module.exports.sort) + .then(function(records) { + return records.map(function(record) { + parsedUrl.host = util.format('%s:%d', record.name, record.port) + parsedUrl.hostname = record.name + parsedUrl.port = record.port + record.url = url.format(parsedUrl) + return record + }) + }) } else { return Promise.resolve([{ - name: domain - , port: defaultPort + url: domain + , name: parsedUrl.hostname + , port: parsedUrl.port }]) } }