diff --git a/lib/connection-parameters.js b/lib/connection-parameters.js index eef40d59..cf78661a 100644 --- a/lib/connection-parameters.js +++ b/lib/connection-parameters.js @@ -27,7 +27,9 @@ var parse = function(str) { return { host: config[0], database: config[1] }; } // url parse expects spaces encoded as %20 - if(/ |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str)) str = encodeURI(str); + if(/ |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str)) { + str = encodeURI(str).replace(/\%25(\d\d)/g, "%$1"); + } var result = url.parse(str, true); config = {}; diff --git a/test/unit/connection-parameters/creation-tests.js b/test/unit/connection-parameters/creation-tests.js index aaab1215..8ccd9886 100644 --- a/test/unit/connection-parameters/creation-tests.js +++ b/test/unit/connection-parameters/creation-tests.js @@ -184,17 +184,26 @@ test('libpq connection string building', function() { assert.equal(subject.password, sourceConfig.password); }); - test('password contains weird characters', function() { + test('username or password contains weird characters', function() { var defaults = require('../../../lib/defaults'); defaults.ssl = true; - var strang = 'postgres://my first name:is&%awesome!@localhost:9000'; + var strang = 'pg://my f%irst name:is&%awesome!@localhost:9000'; var subject = new ConnectionParameters(strang); - assert.equal(subject.user, 'my first name'); + assert.equal(subject.user, 'my f%irst name'); assert.equal(subject.password, 'is&%awesome!'); assert.equal(subject.host, 'localhost'); assert.equal(subject.ssl, true); }); + test("url is properly encoded", function() { + var encoded = "pg://bi%25na%25%25ry%20:s%40f%23@localhost/%20u%2520rl"; + var subject = new ConnectionParameters(encoded); + assert.equal(subject.user, "bi%na%%ry "); + assert.equal(subject.password, "s@f#"); + assert.equal(subject.host, 'localhost'); + assert.equal(subject.database, " u%20rl"); + }); + test('ssl is set on client', function() { var Client = require('../../../lib/client') var defaults = require('../../../lib/defaults');