Skip to content

Commit

Permalink
fix: encode redirect url if not already encoded (#1384)
Browse files Browse the repository at this point in the history
Same bug from express expressjs/express@76eaa32
  • Loading branch information
fengmk2 authored Sep 28, 2019
1 parent 817b498 commit 54e8fab
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 1 deletion.
3 changes: 2 additions & 1 deletion lib/response.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const extname = require('path').extname;
const vary = require('vary');
const only = require('only');
const util = require('util');
const encodeUrl = require('encodeurl');

/**
* Prototype.
Expand Down Expand Up @@ -260,7 +261,7 @@ module.exports = {
redirect(url, alt) {
// location
if ('back' == url) url = this.ctx.get('Referrer') || alt || '/';
this.set('Location', url);
this.set('Location', encodeUrl(url));

// status
if (!statuses.redirect[this.status]) this.status = 302;
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"delegates": "^1.0.0",
"depd": "^1.1.2",
"destroy": "^1.0.4",
"encodeurl": "^1.0.2",
"error-inject": "^1.0.0",
"escape-html": "^1.0.3",
"fresh": "~0.5.2",
Expand Down
19 changes: 19 additions & 0 deletions test/response/redirect.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
'use strict';

const assert = require('assert');
const request = require('supertest');
const context = require('../helpers/context');
const Koa = require('../..');

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

it('should auto fix not encode url', done => {
const app = new Koa();

app.use(ctx => {
ctx.redirect('http://google.com/😓');
});

request(app.callback())
.get('/')
.end((err, res) => {
if (err) return done(err);
assert.equal(res.status, 302);
assert.equal(res.headers.location, 'http://google.com/%F0%9F%98%93');
done();
});
});

describe('with "back"', () => {
it('should redirect to Referrer', () => {
const ctx = context();
Expand Down

0 comments on commit 54e8fab

Please sign in to comment.