Skip to content

Commit 54e8fab

Browse files
authored
fix: encode redirect url if not already encoded (#1384)
Same bug from express expressjs/express@76eaa32
1 parent 817b498 commit 54e8fab

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

Diff for: lib/response.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const extname = require('path').extname;
1919
const vary = require('vary');
2020
const only = require('only');
2121
const util = require('util');
22+
const encodeUrl = require('encodeurl');
2223

2324
/**
2425
* Prototype.
@@ -260,7 +261,7 @@ module.exports = {
260261
redirect(url, alt) {
261262
// location
262263
if ('back' == url) url = this.ctx.get('Referrer') || alt || '/';
263-
this.set('Location', url);
264+
this.set('Location', encodeUrl(url));
264265

265266
// status
266267
if (!statuses.redirect[this.status]) this.status = 302;

Diff for: package.json

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"delegates": "^1.0.0",
3232
"depd": "^1.1.2",
3333
"destroy": "^1.0.4",
34+
"encodeurl": "^1.0.2",
3435
"error-inject": "^1.0.0",
3536
"escape-html": "^1.0.3",
3637
"fresh": "~0.5.2",

Diff for: test/response/redirect.js

+19
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
'use strict';
33

44
const assert = require('assert');
5+
const request = require('supertest');
56
const context = require('../helpers/context');
7+
const Koa = require('../..');
68

79
describe('ctx.redirect(url)', () => {
810
it('should redirect to the given url', () => {
@@ -12,6 +14,23 @@ describe('ctx.redirect(url)', () => {
1214
assert.equal(ctx.status, 302);
1315
});
1416

17+
it('should auto fix not encode url', done => {
18+
const app = new Koa();
19+
20+
app.use(ctx => {
21+
ctx.redirect('http://google.com/😓');
22+
});
23+
24+
request(app.callback())
25+
.get('/')
26+
.end((err, res) => {
27+
if (err) return done(err);
28+
assert.equal(res.status, 302);
29+
assert.equal(res.headers.location, 'http://google.com/%F0%9F%98%93');
30+
done();
31+
});
32+
});
33+
1534
describe('with "back"', () => {
1635
it('should redirect to Referrer', () => {
1736
const ctx = context();

0 commit comments

Comments
 (0)