Skip to content

Commit

Permalink
response.redirect: extract special-cased back
Browse files Browse the repository at this point in the history
  • Loading branch information
fl0w committed Dec 28, 2017
1 parent 6baa411 commit 6209749
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 37 deletions.
1 change: 1 addition & 0 deletions lib/context.js
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ delegate(proto, 'response')
.method('set')
.method('append')
.method('flushHeaders')
.method('back')
.access('status')
.access('message')
.access('body')
Expand Down
28 changes: 19 additions & 9 deletions lib/response.js
Original file line number Diff line number Diff line change
Expand Up @@ -239,25 +239,17 @@ module.exports = {
/**
* Perform a 302 redirect to `url`.
*
* The string "back" is special-cased
* to provide Referrer support, when Referrer
* is not present `alt` or "/" is used.
*
* Examples:
*
* this.redirect('back');
* this.redirect('back', '/index.html');
* this.redirect('/login');
* this.redirect('http://google.com');
*
* @param {String} url
* @param {String} [alt]
* @api public
*/

redirect(url, alt) {
redirect(url) {
// location
if ('back' == url) url = this.ctx.get('Referrer') || alt || '/';
this.set('Location', url);

// status
Expand All @@ -276,6 +268,24 @@ module.exports = {
this.body = `Redirecting to ${url}.`;
},

/**
* Perform a special-cased "back" to provide Referrer support.
* When Referrer is not present, `alt` or "/" is used.
*
* Examples:
*
* ctx.back()
* ctx.back('/index.html')
*
* @param {String} [alt]
* @api public
*/

back(alt) {
const url = this.ctx.get('Referrer') || alt || '/';
this.redirect(url);
},

/**
* Set Content-Disposition header to "attachment" with optional `filename`.
*
Expand Down
33 changes: 33 additions & 0 deletions test/response/back.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@

'use strict';

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

describe('ctx.back([alt])', () => {
it('should redirect to Referrer', () => {
const ctx = context();
ctx.req.headers.referrer = '/login';
ctx.back();
assert.equal(ctx.response.header.location, '/login');
});

it('should redirect to Referer', () => {
const ctx = context();
ctx.req.headers.referer = '/login';
ctx.back();
assert.equal(ctx.response.header.location, '/login');
});

it('should default to alt', () => {
const ctx = context();
ctx.back('/index.html');
assert.equal(ctx.response.header.location, '/index.html');
});

it('should default redirect to /', () => {
const ctx = context();
ctx.back();
assert.equal(ctx.response.header.location, '/');
});
});
28 changes: 0 additions & 28 deletions test/response/redirect.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,34 +12,6 @@ describe('ctx.redirect(url)', () => {
assert.equal(ctx.status, 302);
});

describe('with "back"', () => {
it('should redirect to Referrer', () => {
const ctx = context();
ctx.req.headers.referrer = '/login';
ctx.redirect('back');
assert.equal(ctx.response.header.location, '/login');
});

it('should redirect to Referer', () => {
const ctx = context();
ctx.req.headers.referer = '/login';
ctx.redirect('back');
assert.equal(ctx.response.header.location, '/login');
});

it('should default to alt', () => {
const ctx = context();
ctx.redirect('back', '/index.html');
assert.equal(ctx.response.header.location, '/index.html');
});

it('should default redirect to /', () => {
const ctx = context();
ctx.redirect('back');
assert.equal(ctx.response.header.location, '/');
});
});

describe('when html is accepted', () => {
it('should respond with html', () => {
const ctx = context();
Expand Down

0 comments on commit 6209749

Please sign in to comment.