From 40f08d15929fcb58646075aa4d13e9a56c492695 Mon Sep 17 00:00:00 2001 From: James Allen Date: Wed, 12 Sep 2018 15:25:17 +0100 Subject: [PATCH] Add additional functionality to RedirectManager --- .../infrastructure/RedirectManager.coffee | 39 ++++++++------- .../app/coffee/infrastructure/Server.coffee | 2 +- .../RedirectManagerTests.coffee | 47 ------------------- 3 files changed, 24 insertions(+), 64 deletions(-) delete mode 100644 services/web/test/unit/coffee/infrastructure/RedirectManagerTests.coffee diff --git a/services/web/app/coffee/infrastructure/RedirectManager.coffee b/services/web/app/coffee/infrastructure/RedirectManager.coffee index 0c9141926d..7fac7ef1ec 100644 --- a/services/web/app/coffee/infrastructure/RedirectManager.coffee +++ b/services/web/app/coffee/infrastructure/RedirectManager.coffee @@ -1,20 +1,27 @@ settings = require("settings-sharelatex") logger = require("logger-sharelatex") -module.exports = (req, res, next)-> - - requestedUrl = req.url - - redirectUrl = settings.redirects[requestedUrl] - - #remove starting slash - if !redirectUrl? and requestedUrl[requestedUrl.length-1] == "/" - requestedUrl = requestedUrl.substring(0, requestedUrl.length - 1) - redirectUrl = settings.redirects[requestedUrl] - - if redirectUrl? - logger.log redirectUrl:redirectUrl, reqUrl:req.url, "redirecting to new path" - res.redirect 301, "#{redirectUrl}" - else - next() +module.exports = RedirectManager = + apply: (webRouter) -> + for redirectUrl, target of settings.redirects + do (target) -> + method = target.method || 'get' + webRouter[method] redirectUrl, RedirectManager.createRedirect(target) + createRedirect: (target) -> + (req, res, next) -> + code = 302 + if typeof target is 'string' + url = target + else + if target.method == "post" + code = 307 + if typeof target.url == "function" + url = target.url(req.params) + if !url + return next() + else + url = target.url + if target.baseUrl? + url = "#{target.baseUrl}#{url}" + res.redirect code, url diff --git a/services/web/app/coffee/infrastructure/Server.coffee b/services/web/app/coffee/infrastructure/Server.coffee index bf9d6652f4..dd70fb1a42 100644 --- a/services/web/app/coffee/infrastructure/Server.coffee +++ b/services/web/app/coffee/infrastructure/Server.coffee @@ -73,7 +73,7 @@ app.use multer(dest: Settings.path.uploadFolder) app.use methodOverride() app.use metrics.http.monitor(logger) -app.use RedirectManager +RedirectManager.apply(webRouter) ProxyManager.apply(publicApiRouter) diff --git a/services/web/test/unit/coffee/infrastructure/RedirectManagerTests.coffee b/services/web/test/unit/coffee/infrastructure/RedirectManagerTests.coffee deleted file mode 100644 index 701f427b90..0000000000 --- a/services/web/test/unit/coffee/infrastructure/RedirectManagerTests.coffee +++ /dev/null @@ -1,47 +0,0 @@ -sinon = require('sinon') -chai = require('chai') -should = chai.should() -expect = chai.expect -path = require("path") -modulePath = "../../../../app/js/infrastructure/RedirectManager.js" -SandboxedModule = require('sandboxed-module') - -describe "redirectToNewTemplate", -> - beforeEach -> - @settings = - redirects: - "/path/here/" : "/path/elsewhere/" - "/no/trailing/slash":"/no/trailing/slash/elsewhere" - "/part/path": "/diff/part/path" - mountPointUrl:"/here" - @redirectManager = SandboxedModule.require modulePath, requires: - "settings-sharelatex":@settings - "logger-sharelatex": - log:-> - err:-> - @res = - redirect: sinon.stub() - @req = {} - - describe "redirect", -> - - it "should perminant redirect if url matches redirect", ()-> - @req.url = "/path/here/" - nextStub = sinon.stub() - @redirectManager @req, @res, nextStub - @res.redirect.calledWith(301, "/path/elsewhere/").should.equal true - nextStub.called.should.equal false - - it "should not redirect on non matching url", (done)-> - @req.url = "non/matching/" - @redirectManager @req, @res, => - @res.redirect.called.should.equal false - done() - - it "should ignore slash at end of url", -> - @req.url = "/no/trailing/slash/" - nextStub = sinon.stub() - @redirectManager @req, @res, nextStub - @res.redirect.calledWith(301, "/no/trailing/slash/elsewhere").should.equal true - nextStub.called.should.equal false -