diff --git a/src/core/create_routes.ts b/src/core/create_routes.ts index 26d5342..8bb28b3 100644 --- a/src/core/create_routes.ts +++ b/src/core/create_routes.ts @@ -33,8 +33,8 @@ export default function create_routes({ files } = { files: glob.sync('**/*.+(htm let i = parts.length; let nested = true; while (i--) { - const part = parts[i]; - const dynamic = part[0] === '['; + const part = encodeURIComponent(parts[i].normalize()).replace(/%5B/g, '[').replace(/%5D/g, ']'); + const dynamic = ~part.indexOf('['); if (dynamic) { const matcher = part.replace(param_pattern, `([^\/]+?)`); diff --git a/test/app/routes/fünke.html b/test/app/routes/fünke.html new file mode 100644 index 0000000..088a7aa --- /dev/null +++ b/test/app/routes/fünke.html @@ -0,0 +1 @@ +

I'm afraid I just blue myself

\ No newline at end of file diff --git a/test/common/test.js b/test/common/test.js index 6f47ab4..ee1de09 100644 --- a/test/common/test.js +++ b/test/common/test.js @@ -403,6 +403,14 @@ function run(env) { assert.equal(text, 'nope'); }); }); + + it('encodes routes', () => { + return nightmare.goto(`${base}/fünke`) + .page.title() + .then(title => { + assert.equal(title, `I'm afraid I just blue myself`); + }); + }); }); describe('headers', () => {