diff options
| -rw-r--r-- | src/Resource.js | 4 | ||||
| -rw-r--r-- | test/ResourceSpec.js | 8 | 
2 files changed, 10 insertions, 2 deletions
| diff --git a/src/Resource.js b/src/Resource.js index c6777c67..e801d200 100644 --- a/src/Resource.js +++ b/src/Resource.js @@ -19,13 +19,13 @@ Route.prototype = {      params = params || {};      forEach(this.urlParams, function(_, urlParam){        var value = params[urlParam] || self.defaults[urlParam] || ""; -      url = url.replace(new RegExp(":" + urlParam + "(\\W)"), value + "$1"); +      url = url.replace(new RegExp(":" + urlParam + "(\\W)"), encodeURIComponent(value) + "$1");      });      url = url.replace(/\/?#$/, '');      var query = [];      forEachSorted(params, function(value, key){        if (!self.urlParams[key]) { -        query.push(encodeURI(key) + '=' + encodeURI(value)); +        query.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));        }      });      url = url.replace(/\/*$/, ''); diff --git a/test/ResourceSpec.js b/test/ResourceSpec.js index 8b78df12..d61282ea 100644 --- a/test/ResourceSpec.js +++ b/test/ResourceSpec.js @@ -40,6 +40,14 @@ describe("resource", function() {      R.get({a:4, b:5, c:6});    }); +  it('should correctly encode url params', function(){ +    var R = resource.route('/Path/:a'); +    xhr.expectGET('/Path/foo%231').respond({}); +    xhr.expectGET('/Path/doh!%40foo?bar=baz%231').respond({}); +    R.get({a: 'foo#1'}); +    R.get({a: 'doh!@foo', bar: 'baz#1'}); +  }); +    it("should build resource with default param", function(){      xhr.expectGET('/Order/123/Line/456.visa?minimum=0.05').respond({id:'abc'});      var LineItem = resource.route('/Order/:orderId/Line/:id:verb', {orderId: '123', id: '@id.key', verb:'.visa', minimum:0.05}); | 
