Comparing version 0.3.0 to 0.3.1
0.3.1 / 2013-02-17 | ||
================== | ||
* fixed; allow '#' in username and password #3 | ||
0.3.0 / 2013-01-14 | ||
@@ -3,0 +8,0 @@ ================== |
@@ -12,3 +12,2 @@ // muri | ||
var url = require('url'); | ||
var qs = require('querystring'); | ||
@@ -50,29 +49,21 @@ | ||
uris.split(',').forEach(function (uri) { | ||
if (!/^mongodb:\/\//.test(uri)) { | ||
uri = 'mongodb://' + uri; | ||
} | ||
var o = parse(uri); | ||
var o = url.parse(uri); | ||
if (o.hostname) { | ||
if (o.host) { | ||
ret.hosts.push({ | ||
host: o.hostname | ||
, port: parseInt(o.port || DEFAULT_PORT, 10) | ||
host: o.host | ||
, port: parseInt(o.port, 10) | ||
}) | ||
if (!db && o.pathname) { | ||
db = o.pathname.replace(/^\//, ''); | ||
if (!db && o.db) { | ||
db = o.db; | ||
} | ||
} else { | ||
var domain = /(.+\.sock)(\/?.*)$/.exec(o.pathname); | ||
if (domain && domain[1]) { | ||
ret.hosts.push({ ipc: domain[1] }); | ||
} | ||
} else if (o.ipc) { | ||
ret.hosts.push({ ipc: o.ipc }); | ||
} | ||
if (o.auth) { | ||
var auth = o.auth.split(':'); | ||
ret.auth = { | ||
user: auth[0] | ||
, pass: auth[1] | ||
user: o.auth.user | ||
, pass: o.auth.pass | ||
} | ||
@@ -183,2 +174,59 @@ } | ||
var ipcRgx = /\.sock/; | ||
function parse (uriString) { | ||
// do not use require('url').parse b/c it can't handle # in username or pwd | ||
// mongo uris are strange | ||
var uri = uriString; | ||
var ret = {}; | ||
var parts; | ||
var auth; | ||
var ipcs; | ||
// skip protocol | ||
uri = uri.replace(/^mongodb:\/\//, ''); | ||
// auth | ||
if (/@/.test(uri)) { | ||
parts = uri.split(/@/); | ||
auth = parts[0]; | ||
uri = parts[1]; | ||
parts = auth.split(':'); | ||
ret.auth = {}; | ||
ret.auth.user = parts[0]; | ||
ret.auth.pass = parts[1]; | ||
} | ||
// unix domain sockets | ||
if (ipcRgx.test(uri)) { | ||
ipcs = uri.split(ipcRgx); | ||
ret.ipc = ipcs[0] + '.sock'; | ||
// included a database? | ||
if (ipcs[1]) { | ||
// strip leading / from database name | ||
ipcs[1] = ipcs[1].replace(/^\//, ''); | ||
if (ipcs[1]) { | ||
ret.db = ipcs[1]; | ||
} | ||
} | ||
return ret; | ||
} | ||
// database name | ||
parts = uri.split('/'); | ||
if (parts[1]) ret.db = parts[1]; | ||
// host:port | ||
parts = parts[0].split(':'); | ||
ret.host = parts[0]; | ||
ret.port = parts[1] || DEFAULT_PORT; | ||
return ret; | ||
} | ||
/** | ||
@@ -185,0 +233,0 @@ * Version |
{ | ||
"name": "muri", | ||
"version": "0.3.0", | ||
"version": "0.3.1", | ||
"description": "MongoDB URI parser", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -32,2 +32,20 @@ | ||
}) | ||
it('handles # in the username', function(done){ | ||
var uri = 'mongodb://us#er:password@local:27017'; | ||
var val = muri(uri); | ||
assert.ok(val.auth); | ||
assert.equal('us#er', val.auth.user); | ||
assert.equal('password', val.auth.pass); | ||
done(); | ||
}) | ||
it('handles # in the password', function(done){ | ||
var uri = 'mongodb://user:pa#ssword@local:27017'; | ||
var val = muri(uri); | ||
assert.ok(val.auth); | ||
assert.equal('user', val.auth.user); | ||
assert.equal('pa#ssword', val.auth.pass); | ||
done(); | ||
}) | ||
}) | ||
@@ -271,8 +289,8 @@ | ||
it('all together now', function(done){ | ||
var uri = 'mongodb://user:pass@local,remote:27018,japan:27019/neatdb' | ||
var uri = 'mongodb://u#ser:pas#s@local,remote:27018,japan:27019/neatdb' | ||
uri += '?replicaSet=myreplset&journal=true&w=2&wtimeoutMS=50' | ||
var val = muri(uri); | ||
assert.equal('user', val.auth.user); | ||
assert.equal('pass', val.auth.pass); | ||
assert.equal('u#ser', val.auth.user); | ||
assert.equal('pas#s', val.auth.pass); | ||
assert.equal('neatdb', val.db); | ||
@@ -279,0 +297,0 @@ assert.equal(3, val.hosts.length); |
19802
477