diff --git a/services/web/app/coffee/Features/Compile/CompileController.coffee b/services/web/app/coffee/Features/Compile/CompileController.coffee index ec6ccd677b..eafbe06ab4 100755 --- a/services/web/app/coffee/Features/Compile/CompileController.coffee +++ b/services/web/app/coffee/Features/Compile/CompileController.coffee @@ -64,10 +64,17 @@ module.exports = CompileController = proxyToClsi: (url, req, res, next = (error) ->) -> logger.log url: url, "proxying to CLSI" - url = "#{Settings.apis.clsi.url}#{url}" - oneMinute = 60 * 1000 - proxy = request(url: url, method: req.method, timeout: oneMinute) - proxy.pipe(res) - proxy.on "error", (error) -> - logger.warn err: error, url: url, "CLSI proxy error" - + AuthenticationController.getLoggedInUserId req, (error, user_id) -> + + UserGetter.getUser user_id, {"features.compileGroup":1, "features.compileTimeout":1}, (err, user)-> + if user.features?.compileGroup == "priority" + compilerUrl = Settings.apis.clsi_priority.url + else + compilerUrl = Settings.apis.clsi.url + url = "#{compilerUrl}#{url}" + oneMinute = 60 * 1000 + proxy = request(url: url, method: req.method, timeout: oneMinute) + proxy.pipe(res) + proxy.on "error", (error) -> + logger.warn err: error, url: url, "CLSI proxy error" + diff --git a/services/web/test/UnitTests/coffee/Compile/CompileControllerTests.coffee b/services/web/test/UnitTests/coffee/Compile/CompileControllerTests.coffee index 5cdf58f193..854dc1a799 100644 --- a/services/web/test/UnitTests/coffee/Compile/CompileControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Compile/CompileControllerTests.coffee @@ -20,6 +20,8 @@ describe "CompileController", -> apis: clsi: url: "clsi.example.com" + clsi_priority: + url: "clsi-priority.example.com" "request": @request = sinon.stub() "../../models/Project": Project: @Project = {} "logger-sharelatex": @logger = { log: sinon.stub(), error: sinon.stub() } @@ -145,24 +147,50 @@ describe "CompileController", -> statusCode: 204 headers: { "mock": "header" } @req.method = "mock-method" - @CompileController.proxyToClsi(@url = "/test", @req, @res, @next) + @AuthenticationController.getLoggedInUserId = sinon.stub().callsArgWith(1, null, @user_id = "mock-user-id") + + + describe "user with standard priority", -> + + beforeEach -> + @UserGetter.getUser.callsArgWith(2, null, @user) + @CompileController.proxyToClsi(@url = "/test", @req, @res, @next) + + it "should open a request to the CLSI", -> + @request + .calledWith( + method: @req.method + url: "#{@settings.apis.clsi.url}#{@url}", + timeout: 60 * 1000 + ) + .should.equal true + + it "should pass the request on to the client", -> + @proxy.pipe + .calledWith(@res) + .should.equal true + + it "should bind an error handle to the request proxy", -> + @proxy.on.calledWith("error").should.equal true + + describe "user with priority compile", -> + + beforeEach -> + @user.features.compileGroup = "priority" + @UserGetter.getUser.callsArgWith(2, null, @user) + @CompileController.proxyToClsi(@url = "/test", @req, @res, @next) + + it "should proxy to the priorty url if the user has the feature", ()-> + @request + .calledWith( + method: @req.method + url: "#{@settings.apis.clsi_priority.url}#{@url}", + timeout: 60 * 1000 + ) + .should.equal true - it "should open a request to the CLSI", -> - @request - .calledWith( - method: @req.method - url: "#{@settings.apis.clsi.url}#{@url}", - timeout: 60 * 1000 - ) - .should.equal true - it "should pass the request on to the client", -> - @proxy.pipe - .calledWith(@res) - .should.equal true - it "should bind an error handle to the request proxy", -> - @proxy.on.calledWith("error").should.equal true describe "deleteAuxFiles", -> beforeEach -> @@ -201,3 +229,8 @@ describe "CompileController", -> @CompileController.compileAndDownloadPdf @req, @res @CompileController.proxyToClsi.calledWith("/project/#{@project_id}/output/output.pdf", @req, @res).should.equal true done() + + + + +