0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-02-03 23:00:14 -05:00

Always use our redirects utility (#9132)

no issue

- This started as an attempt to simplify the admin redirect code
- I realised we were sometimes using utils.redirect301 and sometimes not
- Decided to move this into utils.url as it's more relevant to URL generation
- Unified usage of redirects in the codebase
- Updated tests & ensured we have basic coverage
- rename adminRedirect -> redirectToAdmin
- Tweak method signature, fix channel edit redirects
- Tests: Optimised test descriptions for url-redirects_spec.js
- ensure caching works as expected
This commit is contained in:
Hannah Wolfe 2017-10-12 13:36:50 +01:00 committed by Katharina Irrgang
parent 9699016cca
commit 9f9d8b2fec
17 changed files with 384 additions and 316 deletions

View file

@ -10,17 +10,10 @@ module.exports = function frontendRoutes() {
routeKeywords = config.get('routeKeywords');
// ### Admin routes
router.get(/^\/(logout|signout)\/$/, function redirectToSignout(req, res) {
utils.redirect301(res, utils.url.urlJoin(utils.url.urlFor('admin'), '#/signout/'));
});
router.get(/^\/signup\/$/, function redirectToSignup(req, res) {
utils.redirect301(res, utils.url.urlJoin(utils.url.urlFor('admin'), '#/signup/'));
});
router.get(/^\/(logout|signout)\/$/, function (req, res) { return utils.url.redirectToAdmin(301, res, '#/signout/'); });
router.get(/^\/signup\/$/, function (req, res) { return utils.url.redirectToAdmin(301, res, '#/signup/'); });
// redirect to /ghost and let that do the authentication to prevent redirects to /ghost//admin etc.
router.get(/^\/((ghost-admin|admin|wp-admin|dashboard|signin|login)\/?)$/, function redirectToAdmin(req, res) {
utils.redirect301(res, utils.url.urlFor('admin'));
});
router.get(/^\/((ghost-admin|admin|wp-admin|dashboard|signin|login)\/?)$/, function (req, res) { return utils.url.redirectToAdmin(301, res, '/'); });
// Post Live Preview
router.get(utils.url.urlJoin('/', routeKeywords.preview, ':uuid', ':options?'), controllers.preview);

View file

@ -24,7 +24,7 @@ channelConfig = function channelConfig() {
}
},
slugTemplate: true,
editRedirect: utils.url.urlJoin(utils.url.urlFor('admin'), '#/settings/tags/:slug/')
editRedirect: '#/settings/tags/:slug/'
},
author: {
name: 'author',
@ -40,7 +40,7 @@ channelConfig = function channelConfig() {
}
},
slugTemplate: true,
editRedirect: utils.url.urlJoin(utils.url.urlFor('admin'), '#/team/:slug/')
editRedirect: '#/team/:slug/'
}
};

View file

@ -19,9 +19,9 @@ function handlePageParam(req, res, next, page) {
if (page === 1) {
// Page 1 is an alias, do a permanent 301 redirect
if (rssRegex.test(req.url)) {
return utils.redirect301(res, req.originalUrl.replace(rssRegex, '/rss/'));
return utils.url.redirect301(res, req.originalUrl.replace(rssRegex, '/rss/'));
} else {
return utils.redirect301(res, req.originalUrl.replace(pageRegex, '/'));
return utils.url.redirect301(res, req.originalUrl.replace(pageRegex, '/'));
}
} else if (page < 1 || isNaN(page)) {
// Nothing less than 1 is a valid page number, go straight to a 404
@ -47,7 +47,7 @@ rssRouter = function rssRouter(channelConfig) {
router.get(baseRoute, stack);
router.get(utils.url.urlJoin(baseRoute, ':page(\\d+)/'), stack);
router.get('/feed/', function redirectToRSS(req, res) {
return utils.redirect301(res, utils.url.urlJoin(utils.url.getSubdir(), req.baseUrl, baseRoute));
return utils.url.redirect301(res, utils.url.urlJoin(utils.url.getSubdir(), req.baseUrl, baseRoute));
});
router.param('page', handlePageParam);
@ -86,7 +86,7 @@ channelRouter = function router() {
if (channel.editRedirect) {
channelRouter.get('/edit/', function redirect(req, res) {
res.redirect(utils.url.urlJoin(utils.url.getSubdir(), channel.editRedirect.replace(':slug', req.params.slug)));
utils.url.redirectToAdmin(302, res, channel.editRedirect.replace(':slug', req.params.slug));
});
}

View file

@ -21,14 +21,14 @@ module.exports = function preview(req, res, next) {
if (req.params.options && req.params.options.toLowerCase() === 'edit') {
// CASE: last param is of url is /edit, redirect to admin
return res.redirect(utils.url.urlJoin(utils.url.urlFor('admin'), 'editor', post.id, '/'));
return utils.url.redirectToAdmin(302, res, '#/editor/' + post.id);
} else if (req.params.options) {
// CASE: unknown options param detected. Ignore and end in 404.
return next();
}
if (post.status === 'published') {
return res.redirect(301, utils.url.urlFor('post', {post: post}));
return utils.url.redirect301(res, utils.url.urlFor('post', {post: post}));
}
setRequestIsSecure(req, post);

View file

@ -21,12 +21,12 @@ module.exports = function single(req, res, next) {
// CASE: last param is of url is /edit, redirect to admin
if (lookup.isEditURL) {
return res.redirect(utils.url.urlJoin(utils.url.urlFor('admin'), 'editor', post.id, '/'));
return utils.url.redirectToAdmin(302, res, '#/editor/' + post.id);
}
// CASE: permalink is not valid anymore, we redirect him permanently to the correct one
if (post.url !== req.path) {
return res.redirect(301, post.url);
return utils.url.redirect301(res, post.url);
}
setRequestIsSecure(req, post);

View file

@ -7,12 +7,12 @@
// @TODO optimise this to reduce the number of redirects required to get to a pretty URL
// @TODO move this to being used by routers?
var slashes = require('connect-slashes'),
utils = require('../utils');
config = require('../config');
module.exports = [
slashes(true, {
headers: {
'Cache-Control': 'public, max-age=' + utils.ONE_YEAR_S
'Cache-Control': 'public, max-age=' + config.get('caching:301:maxAge')
}
}),
require('./uncapitalise')

View file

@ -39,8 +39,7 @@ uncapitalise = function uncapitalise(req, res, next) {
utils.removeOpenRedirectFromUrl((req.originalUrl || req.url).replace(pathToTest, pathToTest.toLowerCase()))
);
res.set('Cache-Control', 'public, max-age=' + utils.ONE_YEAR_S);
res.redirect(301, redirectPath);
return utils.url.redirect301(res, redirectPath);
} else {
next();
}

View file

@ -102,7 +102,7 @@ urlRedirects = function urlRedirects(req, res, next) {
if (redirectUrl) {
debug('url redirect to: ' + redirectUrl);
return res.redirect(301, redirectUrl);
return utils.url.redirect301(res, redirectUrl);
}
debug('no url redirect');

View file

@ -1,6 +1,5 @@
var unidecode = require('unidecode'),
_ = require('lodash'),
config = require('../config'),
errors = require('../errors'),
i18n = require('../i18n'),
utils,
@ -109,12 +108,6 @@ utils = {
return base64String;
},
redirect301: function redirect301(res, path) {
/*jslint unparam:true*/
res.set({'Cache-Control': 'public, max-age=' + config.get('caching:301:maxAge')});
res.redirect(301, path);
},
/**
* NOTE: No separate utils file, because redirects won't live forever in a JSON file, see V2 of https://github.com/TryGhost/Ghost/issues/7707
*/

View file

@ -349,12 +349,28 @@ function isSSL(urlToParse) {
return protocol === 'https:';
}
function redirect301(res, redirectUrl) {
res.set({'Cache-Control': 'public, max-age=' + config.get('caching:301:maxAge')});
return res.redirect(301, redirectUrl);
}
function redirectToAdmin(status, res, adminPath) {
var redirectUrl = urlJoin(urlFor('admin'), adminPath, '/');
if (status === 301) {
return redirect301(res, redirectUrl);
}
return res.redirect(redirectUrl);
}
module.exports.getProtectedSlugs = getProtectedSlugs;
module.exports.getSubdir = getSubdir;
module.exports.urlJoin = urlJoin;
module.exports.urlFor = urlFor;
module.exports.isSSL = isSSL;
module.exports.urlPathForPost = urlPathForPost;
module.exports.redirectToAdmin = redirectToAdmin;
module.exports.redirect301 = redirect301;
/**
* If you request **any** image in Ghost, it get's served via

View file

@ -94,7 +94,8 @@ describe('Public API', function () {
request.get(testUtils.API.getApiQuery('posts?client_id=ghost-test&client_secret=not_available'))
.set('Origin', 'https://example.com')
.expect('Cache-Control', testUtils.cacheRules.private)
// 301 Redirects _should_ be cached
.expect('Cache-Control', testUtils.cacheRules.year)
.expect(301)
.end(function (err, res) {
if (err) {

View file

@ -263,7 +263,7 @@ describe('Frontend Routing', function () {
it('should redirect to editor', function (done) {
request.get('/welcome/edit/')
.expect('Location', /ghost\/editor\/\w+/)
.expect('Location', /ghost\/#\/editor\/\w+/)
.expect('Cache-Control', testUtils.cacheRules.public)
.expect(302)
.end(doEnd(done));
@ -412,7 +412,7 @@ describe('Frontend Routing', function () {
it('should redirect to editor', function (done) {
request.get('/static-page-test/edit/')
.expect('Location', /ghost\/editor\/\w+/)
.expect('Location', /ghost\/#\/editor\/\w+/)
.expect('Cache-Control', testUtils.cacheRules.public)
.expect(302)
.end(doEnd(done));
@ -473,7 +473,7 @@ describe('Frontend Routing', function () {
request.get('/p/2ac6b4f6-e1f3-406c-9247-c94a0496d39d/')
.expect(301)
.expect('Location', '/short-and-sweet/')
.expect('Cache-Control', testUtils.cacheRules.public)
.expect('Cache-Control', testUtils.cacheRules.year)
.end(doEnd(done));
});

View file

@ -115,7 +115,8 @@ describe('Controllers', function () {
res = {
locals: {},
render: sinon.spy(),
redirect: sinon.spy()
redirect: sinon.spy(),
set: sinon.spy()
};
});
@ -152,6 +153,7 @@ describe('Controllers', function () {
should.not.exist(err);
res.render.called.should.be.false();
res.redirect.called.should.be.false();
res.set.called.should.be.false();
done();
});
@ -161,6 +163,7 @@ describe('Controllers', function () {
req.params = {uuid: 'abc-1234-03'};
res.redirect = function (status, url) {
res.render.called.should.be.false();
res.set.called.should.be.true();
status.should.eql(301);
url.should.eql('/getting-started/');
@ -174,7 +177,8 @@ describe('Controllers', function () {
req.params = {uuid: 'abc-1234-01', options: 'edit'};
res.redirect = function (url) {
res.render.called.should.be.false();
url.should.eql('/ghost/editor/1/');
res.set.called.should.be.false();
url.should.eql('/ghost/#/editor/1/');
done();
};
@ -189,6 +193,7 @@ describe('Controllers', function () {
should.not.exist(err);
res.render.called.should.be.false();
res.redirect.called.should.be.false();
res.set.called.should.be.false();
done();
});

View file

@ -17,7 +17,7 @@ var should = require('should'),
sandbox = sinon.sandbox.create();
describe('Controllers', function () {
var adminEditPagePath = '/ghost/editor/',
var adminEditPagePath = '/ghost/#/editor/',
localSettingsCache = {},
hasTemplateStub;

View file

@ -15,7 +15,8 @@ describe('UNIT: url redirects', function () {
}
};
res = {
redirect: sandbox.spy()
redirect: sandbox.spy(),
set: sandbox.spy()
};
next = sandbox.spy();
@ -27,300 +28,330 @@ describe('UNIT: url redirects', function () {
host = null;
});
it('blog is http, requester uses http', function (done) {
configUtils.set({
url: 'http://default.com:2368/'
describe('expect redirect', function () {
it('blog is https, request is http', function (done) {
configUtils.set({
url: 'https://default.com:2368/'
});
host = 'default.com:2368';
req.originalUrl = '/';
urlRedirects(req, res, next);
next.called.should.be.false();
res.redirect.called.should.be.true();
res.redirect.calledWith(301, 'https://default.com:2368/').should.be.true();
res.set.called.should.be.true();
done();
});
host = 'default.com:2368';
it('blog host is !== request host', function (done) {
configUtils.set({
url: 'https://default.com'
});
req.originalUrl = '/';
urlRedirects(req, res, next);
next.called.should.be.true();
res.redirect.called.should.be.false();
next.calledWith().should.be.true();
done();
host = 'localhost:2368';
req.originalUrl = '/';
urlRedirects(req, res, next);
next.called.should.be.false();
res.redirect.called.should.be.true();
res.redirect.calledWith(301, 'https://localhost:2368/').should.be.true();
res.set.called.should.be.true();
done();
});
it('url and admin url are equal, but protocol is different, request is http', function (done) {
configUtils.set({
url: 'http://default.com:2368',
admin: {
url: 'https://default.com:2368'
}
});
host = 'default.com:2368';
res.isAdmin = true;
req.originalUrl = '/ghost';
urlRedirects(req, res, next);
next.called.should.be.false();
res.redirect.calledWith(301, 'https://default.com:2368/ghost/').should.be.true();
res.set.called.should.be.true();
done();
});
it('url and admin url are different, request is http', function (done) {
configUtils.set({
url: 'http://default.com:2368',
admin: {
url: 'https://admin.default.com:2368'
}
});
host = 'default.com:2368';
res.isAdmin = true;
req.originalUrl = '/ghost';
urlRedirects(req, res, next);
next.called.should.be.false();
res.redirect.calledWith(301, 'https://admin.default.com:2368/ghost/').should.be.true();
res.set.called.should.be.true();
done();
});
it('subdirectory', function (done) {
configUtils.set({
url: 'http://default.com:2368/blog',
admin: {
url: 'https://admin.default.com:2368'
}
});
host = 'default.com:2368';
res.isAdmin = true;
req.originalUrl = '/blog/ghost';
urlRedirects(req, res, next);
next.called.should.be.false();
res.redirect.calledWith(301, 'https://admin.default.com:2368/blog/ghost/').should.be.true();
res.set.called.should.be.true();
req.secure = true;
host = 'admin.default.com:2368';
urlRedirects(req, res, next);
next.called.should.be.true();
res.redirect.calledOnce.should.be.true();
res.set.calledOnce.should.be.true();
done();
});
it('keeps query', function (done) {
configUtils.set({
url: 'http://default.com:2368',
admin: {
url: 'https://admin.default.com:2368'
}
});
host = 'default.com:2368';
res.isAdmin = true;
req.originalUrl = '/ghost';
req.query = {
test: true
};
urlRedirects(req, res, next);
next.called.should.be.false();
res.redirect.calledWith(301, 'https://admin.default.com:2368/ghost/?test=true').should.be.true();
res.set.called.should.be.true();
done();
});
it('original url has search params', function (done) {
configUtils.set({
url: 'http://default.com:2368',
admin: {
url: 'https://admin.default.com:2368'
}
});
host = 'default.com:2368';
res.isAdmin = true;
req.originalUrl = '/ghost/something?a=b';
req.query = {
a: 'b'
};
urlRedirects(req, res, next);
next.called.should.be.false();
res.redirect.calledWith(301, 'https://admin.default.com:2368/ghost/something/?a=b').should.be.true();
res.set.called.should.be.true();
done();
});
it('ensure redirect loop won\'t happen', function (done) {
configUtils.set({
url: 'http://default.com:2368',
admin: {
url: 'https://default.com:2368'
}
});
host = 'default.com:2368';
res.isAdmin = true;
req.originalUrl = '/ghost';
urlRedirects(req, res, next);
next.called.should.be.false();
res.redirect.calledWith(301, 'https://default.com:2368/ghost/').should.be.true();
res.set.called.should.be.true();
res.redirect.reset();
req.secure = true;
urlRedirects(req, res, next);
res.redirect.called.should.be.false();
res.set.calledOnce.should.be.true();
next.called.should.be.true();
done();
});
});
it('blog is https, requester uses https', function (done) {
configUtils.set({
url: 'https://default.com:2368/'
describe('expect no redirect', function () {
it('blog is http, request is http', function (done) {
configUtils.set({
url: 'http://default.com:2368/'
});
host = 'default.com:2368';
req.originalUrl = '/';
urlRedirects(req, res, next);
next.called.should.be.true();
res.redirect.called.should.be.false();
res.set.called.should.be.false();
next.calledWith().should.be.true();
done();
});
host = 'default.com:2368';
it('blog is http, request is https', function (done) {
configUtils.set({
url: 'http://default.com:2368/'
});
req.originalUrl = '/';
req.secure = true;
urlRedirects(req, res, next);
next.called.should.be.true();
res.redirect.called.should.be.false();
next.calledWith().should.be.true();
done();
});
host = 'default.com:2368';
it('[redirect] blog is https, requester uses http', function (done) {
configUtils.set({
url: 'https://default.com:2368/'
req.originalUrl = '/';
req.secure = true;
urlRedirects(req, res, next);
next.called.should.be.true();
res.redirect.called.should.be.false();
res.set.called.should.be.false();
done();
});
host = 'default.com:2368';
it('blog is http, request is https (trailing slash is missing)', function (done) {
configUtils.set({
url: 'http://default.com:2368/'
});
req.originalUrl = '/';
urlRedirects(req, res, next);
next.called.should.be.false();
res.redirect.called.should.be.true();
res.redirect.calledWith(301, 'https://default.com:2368/').should.be.true();
done();
});
host = 'default.com:2368/';
it('blog is http, requester uses https', function (done) {
configUtils.set({
url: 'http://default.com:2368/'
req.originalUrl = '/';
req.secure = true;
urlRedirects(req, res, next);
next.called.should.be.true();
res.redirect.called.should.be.false();
res.set.called.should.be.false();
done();
});
host = 'default.com:2368';
it('blog is https, request is https', function (done) {
configUtils.set({
url: 'https://default.com:2368/'
});
req.originalUrl = '/';
req.secure = true;
urlRedirects(req, res, next);
next.called.should.be.true();
res.redirect.called.should.be.false();
done();
});
host = 'default.com:2368';
it('blog is http, requester uses https', function (done) {
configUtils.set({
url: 'http://default.com:2368/'
req.originalUrl = '/';
req.secure = true;
urlRedirects(req, res, next);
next.called.should.be.true();
res.redirect.called.should.be.false();
res.set.called.should.be.false();
next.calledWith().should.be.true();
done();
});
host = 'default.com:2368/';
it('blog host is !== request host', function (done) {
configUtils.set({
url: 'https://default.com'
});
req.originalUrl = '/';
req.secure = true;
urlRedirects(req, res, next);
next.called.should.be.true();
res.redirect.called.should.be.false();
done();
});
host = 'localhost:2368';
it('blog host is !== request host', function (done) {
configUtils.set({
url: 'https://default.com'
req.originalUrl = '/';
req.secure = true;
urlRedirects(req, res, next);
next.called.should.be.true();
res.redirect.called.should.be.false();
res.set.called.should.be.false();
done();
});
host = 'localhost:2368';
it('admin is blog url and http, requester is http', function (done) {
configUtils.set({
url: 'http://default.com:2368'
});
req.originalUrl = '/';
req.secure = true;
urlRedirects(req, res, next);
next.called.should.be.true();
res.redirect.called.should.be.false();
done();
});
host = 'default.com:2368';
res.isAdmin = true;
it('[redirect] blog host is !== request host', function (done) {
configUtils.set({
url: 'https://default.com'
req.originalUrl = '/ghost';
urlRedirects(req, res, next);
next.called.should.be.true();
res.redirect.called.should.be.false();
res.set.called.should.be.false();
done();
});
host = 'localhost:2368';
it('admin request, no custom admin.url configured', function (done) {
configUtils.set({
url: 'http://default.com:2368'
});
req.originalUrl = '/';
urlRedirects(req, res, next);
next.called.should.be.false();
res.redirect.called.should.be.true();
res.redirect.calledWith(301, 'https://localhost:2368/').should.be.true();
done();
});
host = 'localhost:2368';
res.isAdmin = true;
it('admin is blog url and http, requester is http', function (done) {
configUtils.set({
url: 'http://default.com:2368'
req.originalUrl = '/ghost';
urlRedirects(req, res, next);
next.called.should.be.true();
res.redirect.called.should.be.false();
res.set.called.should.be.false();
done();
});
host = 'default.com:2368';
res.isAdmin = true;
it('url and admin url are different, protocol is different, request is not secure', function (done) {
configUtils.set({
url: 'http://blog.ghost.org',
admin: {
url: 'http://something.com'
}
});
req.originalUrl = '/ghost';
urlRedirects(req, res, next);
next.called.should.be.true();
res.redirect.called.should.be.false();
done();
});
host = 'something.com';
res.isAdmin = true;
req.secure = false;
it('admin request, no custom admin.url configured', function (done) {
configUtils.set({
url: 'http://default.com:2368'
req.originalUrl = '/ghost';
urlRedirects(req, res, next);
res.redirect.called.should.be.false();
res.set.called.should.be.false();
next.called.should.be.true();
done();
});
host = 'localhost:2368';
res.isAdmin = true;
it('url and admin url are different, protocol is different, request is secure', function (done) {
configUtils.set({
url: 'http://blog.ghost.org',
admin: {
url: 'http://something.com'
}
});
req.originalUrl = '/ghost';
urlRedirects(req, res, next);
next.called.should.be.true();
res.redirect.called.should.be.false();
done();
});
host = 'something.com';
res.isAdmin = true;
req.secure = true;
it('[redirect] admin is custom url and https, requester is http', function (done) {
configUtils.set({
url: 'http://default.com:2368',
admin: {
url: 'https://default.com:2368'
}
req.originalUrl = '/ghost';
urlRedirects(req, res, next);
res.redirect.called.should.be.false();
res.set.called.should.be.false();
next.called.should.be.true();
done();
});
host = 'default.com:2368';
res.isAdmin = true;
req.originalUrl = '/ghost';
urlRedirects(req, res, next);
next.called.should.be.false();
res.redirect.calledWith(301, 'https://default.com:2368/ghost/').should.be.true();
done();
});
it('[redirect] admin is custom url and https, requester is http', function (done) {
configUtils.set({
url: 'http://default.com:2368',
admin: {
url: 'https://admin.default.com:2368'
}
});
host = 'default.com:2368';
res.isAdmin = true;
req.originalUrl = '/ghost';
urlRedirects(req, res, next);
next.called.should.be.false();
res.redirect.calledWith(301, 'https://admin.default.com:2368/ghost/').should.be.true();
done();
});
it('[redirect] subdirectory', function (done) {
configUtils.set({
url: 'http://default.com:2368/blog',
admin: {
url: 'https://admin.default.com:2368'
}
});
host = 'default.com:2368';
res.isAdmin = true;
req.originalUrl = '/blog/ghost';
urlRedirects(req, res, next);
next.called.should.be.false();
res.redirect.calledWith(301, 'https://admin.default.com:2368/blog/ghost/').should.be.true();
req.secure = true;
host = 'admin.default.com:2368';
urlRedirects(req, res, next);
next.called.should.be.true();
done();
});
it('[redirect] keeps query', function (done) {
configUtils.set({
url: 'http://default.com:2368',
admin: {
url: 'https://admin.default.com:2368'
}
});
host = 'default.com:2368';
res.isAdmin = true;
req.originalUrl = '/ghost';
req.query = {
test: true
};
urlRedirects(req, res, next);
next.called.should.be.false();
res.redirect.calledWith(301, 'https://admin.default.com:2368/ghost/?test=true').should.be.true();
done();
});
it('[redirect] original url has search params', function (done) {
configUtils.set({
url: 'http://default.com:2368',
admin: {
url: 'https://admin.default.com:2368'
}
});
host = 'default.com:2368';
res.isAdmin = true;
req.originalUrl = '/ghost/something?a=b';
req.query = {
a: 'b'
};
urlRedirects(req, res, next);
next.called.should.be.false();
res.redirect.calledWith(301, 'https://admin.default.com:2368/ghost/something/?a=b').should.be.true();
done();
});
it('[redirect] same url and admin url, but different protocol.', function (done) {
configUtils.set({
url: 'http://default.com:2368',
admin: {
url: 'https://default.com:2368'
}
});
host = 'default.com:2368';
res.isAdmin = true;
req.originalUrl = '/ghost';
urlRedirects(req, res, next);
next.called.should.be.false();
res.redirect.calledWith(301, 'https://default.com:2368/ghost/').should.be.true();
req.secure = true;
urlRedirects(req, res, next);
next.called.should.be.true();
done();
});
it('[no redirect] different url and admin url, but different protocol.', function (done) {
configUtils.set({
url: 'http://blog.ghost.org',
admin: {
url: 'http://something.com'
}
});
host = 'something.com';
res.isAdmin = true;
req.secure = false;
req.originalUrl = '/ghost';
urlRedirects(req, res, next);
next.called.should.be.true();
done();
});
it('[no redirect] different url and admin url, but different protocol.', function (done) {
configUtils.set({
url: 'http://blog.ghost.org',
admin: {
url: 'http://something.com'
}
});
host = 'something.com';
res.isAdmin = true;
req.secure = true;
req.originalUrl = '/ghost';
urlRedirects(req, res, next);
next.called.should.be.true();
done();
});
});

View file

@ -1,5 +1,4 @@
var should = require('should'), // jshint ignore:line
sinon = require('sinon'),
nock = require('nock'),
configUtils = require('../utils/configUtils'),
gravatar = require('../../server/utils/gravatar'),
@ -145,22 +144,4 @@ describe('Server Utilities', function () {
}).catch(done);
});
});
describe('redirect301', function () {
it('performs a 301 correctly', function (done) {
var res = {};
res.set = sinon.spy();
res.redirect = function (code, path) {
code.should.equal(301);
path.should.eql('my/awesome/path');
res.set.calledWith({'Cache-Control': 'public, max-age=' + utils.ONE_YEAR_S}).should.be.true();
done();
};
utils.redirect301(res, 'my/awesome/path');
});
});
});

View file

@ -576,4 +576,53 @@ describe('Url', function () {
utils.url.urlPathForPost(testData).should.equal(postLink);
});
});
describe('redirects', function () {
it('performs 301 redirect correctly', function (done) {
var res = {};
res.set = sinon.spy();
res.redirect = function (code, path) {
code.should.equal(301);
path.should.eql('my/awesome/path');
res.set.calledWith({'Cache-Control': 'public, max-age=' + utils.ONE_YEAR_S}).should.be.true();
done();
};
utils.url.redirect301(res, 'my/awesome/path');
});
it('performs an admin 301 redirect correctly', function (done) {
var res = {};
res.set = sinon.spy();
res.redirect = function (code, path) {
code.should.equal(301);
path.should.eql('/ghost/#/my/awesome/path/');
res.set.calledWith({'Cache-Control': 'public, max-age=' + utils.ONE_YEAR_S}).should.be.true();
done();
};
utils.url.redirectToAdmin(301, res, '#/my/awesome/path');
});
it('performs an admin 302 redirect correctly', function (done) {
var res = {};
res.set = sinon.spy();
res.redirect = function (path) {
path.should.eql('/ghost/#/my/awesome/path/');
res.set.called.should.be.false();
done();
};
utils.url.redirectToAdmin(302, res, '#/my/awesome/path');
});
});
});