Skip to content

Commit 953235a

Browse files
fix(urlMatcherFactory): fix tilde edge case with "string" encoding (#3021)
makes it possible to bidirectionally encode/decode "~2F"
1 parent 6ac1c61 commit 953235a

File tree

2 files changed

+4
-2
lines changed

2 files changed

+4
-2
lines changed

src/urlMatcherFactory.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -595,8 +595,8 @@ function $UrlMatcherFactory() {
595595
// If the slashes are simply URLEncoded, the browser can choose to pre-decode them,
596596
// and bidirectional encoding/decoding fails.
597597
// Tilde was chosen because it's not a RFC 3986 section 2.2 Reserved Character
598-
function valToString(val) { return val != null ? val.toString().replace(/~/g, "~~").replace(/\//g, "~2F") : val; }
599-
function valFromString(val) { return val != null ? val.toString().replace(/~2F/g, "/").replace(/~~/g, "~") : val; }
598+
function valToString(val) { return val != null ? val.toString().replace(/(~|\/)/g, function (m) { return {'~':'~~', '/':'~2F'}[m]; }) : val; }
599+
function valFromString(val) { return val != null ? val.toString().replace(/(~~|~2F)/g, function (m) { return {'~~':'~', '~2F':'/'}[m]; }) : val; }
600600

601601
var $types = {}, enqueue = true, typeQueue = [], injector, defaultTypes = {
602602
"string": {

test/urlMatcherFactorySpec.js

+2
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,11 @@ describe("UrlMatcher", function () {
9292

9393
expect(matcher1.format({ foo: "abc" })).toBe('/abc');
9494
expect(matcher1.format({ foo: "~abc" })).toBe('/~~abc');
95+
expect(matcher1.format({ foo: "~2F" })).toBe('/~~2F');
9596

9697
expect(matcher1.exec('/abc').foo).toBe("abc");
9798
expect(matcher1.exec('/~~abc').foo).toBe("~abc");
99+
expect(matcher1.exec('/~~2F').foo).toBe("~2F");
98100
});
99101

100102
describe("snake-case parameters", function() {

0 commit comments

Comments
 (0)