Skip to content

Commit

Permalink
response.redirect: extract special-cased back, fixes #904 (#1115)
Browse files Browse the repository at this point in the history
The simple solution to drop special-cased `'back'` in
`response.redirect`.
I can't label but should be labeled as version-major.

This PR **does not** make use of Symbol as purposed in #904.

**Edit**
If this solution is acceptable, a deprecation should be added to Koa 2
on `'back'` use.

---------

Co-authored-by: Kevin Peno <kjpeno@outlook.com>
  • Loading branch information
fl0w and kevinpeno authored Oct 20, 2024
1 parent ff0f3b6 commit f9f7714
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 1 deletion.
32 changes: 32 additions & 0 deletions __tests__/response/back.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
'use strict'

const assert = require('assert')
const context = require('../../test-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, '/')
})
})
1 change: 1 addition & 0 deletions lib/context.js
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,7 @@ delegate(proto, 'response')
.method('set')
.method('append')
.method('flushHeaders')
.method('back')
.access('status')
.access('message')
.access('body')
Expand Down
25 changes: 24 additions & 1 deletion lib/response.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ const only = require('./only.js')
const util = require('util')
const encodeUrl = require('encodeurl')
const Stream = require('stream')
const deprecate = require('depd')('koa')

/**
* Prototype.
Expand Down Expand Up @@ -293,7 +294,11 @@ module.exports = {

redirect (url, alt) {
// location
if (url === 'back') url = this.ctx.get('Referrer') || alt || '/'
if (url === 'back') {
deprecate('Special-cased string "back" through redirect will be removed in v3, ' +
'consider migrating usage to ctx.back() instead.')
url = this.ctx.get('Referrer') || alt || '/'
}
if (/^https?:\/\//i.test(url)) {
// formatting url again avoid security escapes
url = new URL(url).toString()
Expand All @@ -316,6 +321,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

0 comments on commit f9f7714

Please sign in to comment.