diff --git a/lib/route-recognizer.js b/lib/route-recognizer.js index 65320c2..4ab75f5 100644 --- a/lib/route-recognizer.js +++ b/lib/route-recognizer.js @@ -497,7 +497,7 @@ RouteRecognizer.prototype = { queryParams = this.parseQueryString(queryString); } - path = decodeURI(path); + path = decodeURIComponent(path); // DEBUG GROUP path diff --git a/tests/recognizer-tests.js b/tests/recognizer-tests.js index 02bb319..7181ab8 100644 --- a/tests/recognizer-tests.js +++ b/tests/recognizer-tests.js @@ -20,6 +20,14 @@ test("A simple route recognizes", function() { equal(router.recognize("/foo/baz"), null); }); +test("A route with URL-encoded parts recognizes", function() { + var handler = {}; + var router = new RouteRecognizer(); + router.add([{ path: "/foo bar?baz", handler: handler }]); + + resultsMatch(router.recognize("/foo%20bar%3fbaz"), [{ handler: handler, params: {}, isDynamic: false }]); +}); + test("A unicode route recognizes", function() { var handler = {}; var router = new RouteRecognizer(); @@ -129,6 +137,16 @@ test("A dynamic route recognizes", function() { equal(router.recognize("/zoo/baz"), null); }); +test("A dynamic route with encoded params", function() { + var handler = {}; + var router = new RouteRecognizer(); + router.add([{ path: "/foo/:bar", handler: handler }]); + + equal(router.recognize("/foo/bar%20baz")[0].params.bar, "bar baz"); + equal(router.recognize("/foo/bar%23baz")[0].params.bar, "bar#baz"); + equal(router.recognize("/foo/bar%3fbaz")[0].params.bar, "bar?baz"); +}); + test("Multiple routes recognize", function() { var handler1 = { handler: 1 }; var handler2 = { handler: 2 };