From f281443c89a1865ba0972fe92fd2ec641ec65034 Mon Sep 17 00:00:00 2001 From: Douglas Christopher Wilson Date: Tue, 10 May 2016 01:36:51 -0400 Subject: [PATCH] Fix redirect error when req.url contains raw non-URL characters --- HISTORY.md | 1 + index.js | 3 ++- package.json | 1 + "test/fixtures/snow \342\230\203/.gitkeep" | 0 test/test.js | 12 +++++++++++- 5 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 "test/fixtures/snow \342\230\203/.gitkeep" diff --git a/HISTORY.md b/HISTORY.md index e9301c1..98773ce 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,6 +1,7 @@ unreleased ========== + * Fix redirect error when `req.url` contains raw non-URL characters * deps: send@0.14.1 1.11.0 / 2016-06-07 diff --git a/index.js b/index.js index 2aa1842..83c5e4f 100644 --- a/index.js +++ b/index.js @@ -13,6 +13,7 @@ * @private */ +var encodeUrl = require('encodeurl') var escapeHtml = require('escape-html') var parseUrl = require('parseurl') var resolve = require('path').resolve @@ -172,7 +173,7 @@ function createRedirectDirectoryListener () { originalUrl.pathname = collapseLeadingSlashes(originalUrl.pathname + '/') // reformat the URL - var loc = url.format(originalUrl) + var loc = encodeUrl(url.format(originalUrl)) var msg = 'Redirecting to ' + escapeHtml(loc) + '\n' var res = this.res diff --git a/package.json b/package.json index 9856b52..a9b404c 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "license": "MIT", "repository": "expressjs/serve-static", "dependencies": { + "encodeurl": "~1.0.1", "escape-html": "~1.0.3", "parseurl": "~1.3.1", "send": "0.14.1" diff --git "a/test/fixtures/snow \342\230\203/.gitkeep" "b/test/fixtures/snow \342\230\203/.gitkeep" new file mode 100644 index 0000000..e69de29 diff --git a/test/test.js b/test/test.js index 08db64a..9fc327a 100644 --- a/test/test.js +++ b/test/test.js @@ -435,7 +435,9 @@ describe('serveStatic()', function () { describe('redirect', function () { var server before(function () { - server = createServer(fixtures) + server = createServer(fixtures, null, function (req, res) { + req.url = req.url.replace(/\/snow(\/|$)/, '/snow \u2603$1') + }) }) it('should redirect directories', function (done) { @@ -466,6 +468,14 @@ describe('serveStatic()', function () { .expect(301, done) }) + it('should ensure redirect URL is properly encoded', function (done) { + request(server) + .get('/snow') + .expect('Location', '/snow%20%E2%98%83/') + .expect('Content-Type', /html/) + .expect(301, 'Redirecting to /snow%20%E2%98%83/\n', done) + }) + it('should not redirect incorrectly', function (done) { request(server) .get('/')