renamed ClsiRequestManager to ClsiCookieManager and improved logging
This commit is contained in:
+16
-13
@@ -2,7 +2,8 @@ Settings = require "settings-sharelatex"
|
||||
request = require('request')
|
||||
redis = require("redis-sharelatex")
|
||||
rclient = redis.createClient(Settings.redis.web)
|
||||
cookie = require('cookie')
|
||||
Cookie = require('cookie')
|
||||
logger = require "logger-sharelatex"
|
||||
|
||||
buildKey = (project_id)->
|
||||
return "clsiserver:#{project_id}"
|
||||
@@ -10,7 +11,7 @@ buildKey = (project_id)->
|
||||
|
||||
ONE_WEEK_IN_SECONDS = 60 * 60 * 24 * 7
|
||||
|
||||
module.exports = ClsiRequestManager =
|
||||
module.exports = ClsiCookieManager =
|
||||
|
||||
_getServerId : (project_id, callback = (err, serverId)->)->
|
||||
multi = rclient.multi()
|
||||
@@ -23,38 +24,40 @@ module.exports = ClsiRequestManager =
|
||||
if serverId?
|
||||
return callback(null, serverId)
|
||||
else
|
||||
return ClsiRequestManager._getServerIdViaRequest project_id, callback
|
||||
return ClsiCookieManager._populateServerIdViaRequest project_id, callback
|
||||
|
||||
|
||||
_getServerIdViaRequest :(project_id, callback = (err, serverId)->)->
|
||||
_populateServerIdViaRequest :(project_id, callback = (err, serverId)->)->
|
||||
url = "#{Settings.apis.clsi.url}/project/#{project_id}/status"
|
||||
request.get url, (err, res, body)->
|
||||
if err?
|
||||
logger.err err:err, project_id:project_id, "error getting initial server id for project"
|
||||
return callback(err)
|
||||
ClsiRequestManager.setServerId project_id, res, callback
|
||||
ClsiCookieManager.setServerId project_id, res, (err)->
|
||||
if err?
|
||||
logger.err err:err, project_id:project_id, "error setting server id via populate request"
|
||||
callback(err)
|
||||
|
||||
_parseServerIdFromResponse : (response)->
|
||||
console.log response.headers
|
||||
cookies = cookie.parse(response.headers["set-cookie"]?[0] or "")
|
||||
return cookies?.clsiserver
|
||||
cookies = Cookie.parse(response.headers["set-cookie"]?[0] or "")
|
||||
return cookies?[Settings.clsiCookieKey]
|
||||
|
||||
setServerId: (project_id, response, callback = ->)->
|
||||
serverId = ClsiRequestManager._parseServerIdFromResponse(response)
|
||||
serverId = ClsiCookieManager._parseServerIdFromResponse(response)
|
||||
multi = rclient.multi()
|
||||
multi.set buildKey(project_id), serverId
|
||||
multi.expire buildKey(project_id), ONE_WEEK_IN_SECONDS
|
||||
multi.exec callback
|
||||
|
||||
|
||||
getCookieJar: (project_id, opts, callback = (err, jar)->)->
|
||||
ClsiRequestManager._getServerId project_id, (err, serverId)=>
|
||||
getCookieJar: (project_id, callback = (err, jar)->)->
|
||||
ClsiCookieManager._getServerId project_id, (err, serverId)=>
|
||||
if err?
|
||||
logger.err err:err, project_id:project_id, "error getting server id"
|
||||
return callback(err)
|
||||
cookie = request.cookie("clsiserver=#{serverId}")
|
||||
serverCookie = request.cookie("clsiserver=#{serverId}")
|
||||
jar = request.jar()
|
||||
jar.setCookie cookie, Settings.apis.clsi.url
|
||||
jar.setCookie serverCookie, Settings.apis.clsi.url
|
||||
callback(null, jar)
|
||||
|
||||
|
||||
@@ -6,25 +6,19 @@ Project = require("../../models/Project").Project
|
||||
ProjectEntityHandler = require("../Project/ProjectEntityHandler")
|
||||
logger = require "logger-sharelatex"
|
||||
url = require("url")
|
||||
ClsiRequestManager = require("./ClsiRequestManager")
|
||||
ClsiCookieManager = require("./ClsiCookieManager")
|
||||
|
||||
|
||||
module.exports = ClsiManager =
|
||||
|
||||
_makeRequest: (project_id, opts, callback)->
|
||||
ClsiRequestManager.getCookieJar project_id, (err, jar)->
|
||||
if err?
|
||||
logger.err err:err, "error getting cookie jar for clsi request"
|
||||
return callback(err)
|
||||
opts.jar = jar
|
||||
request opts, callback
|
||||
|
||||
sendRequest: (project_id, options = {}, callback = (error, success) ->) ->
|
||||
ClsiManager._buildRequest project_id, options, (error, req) ->
|
||||
return callback(error) if error?
|
||||
logger.log project_id: project_id, "sending compile to CLSI"
|
||||
ClsiManager._postToClsi project_id, req, options.compileGroup, (error, response) ->
|
||||
return callback(error) if error?
|
||||
if error?
|
||||
logger.err err:error, project_id:project_id, "error sending request to clsi"
|
||||
return callback(error)
|
||||
logger.log project_id: project_id, response: response, "received compile response from CLSI"
|
||||
callback(
|
||||
null
|
||||
@@ -39,6 +33,16 @@ module.exports = ClsiManager =
|
||||
method:"DELETE"
|
||||
ClsiManager._makeRequest project_id, opts, callback
|
||||
|
||||
|
||||
_makeRequest: (project_id, opts, callback)->
|
||||
ClsiCookieManager.getCookieJar project_id, (err, jar)->
|
||||
if err?
|
||||
logger.err err:err, "error getting cookie jar for clsi request"
|
||||
return callback(err)
|
||||
opts.jar = jar
|
||||
request opts, callback
|
||||
|
||||
|
||||
_getCompilerUrl: (compileGroup) ->
|
||||
if compileGroup == "priority"
|
||||
return Settings.apis.clsi_priority.url
|
||||
|
||||
@@ -8,7 +8,7 @@ Settings = require "settings-sharelatex"
|
||||
AuthenticationController = require "../Authentication/AuthenticationController"
|
||||
UserGetter = require "../User/UserGetter"
|
||||
RateLimiter = require("../../infrastructure/RateLimiter")
|
||||
ClsiRequestManager = require("./ClsiRequestManager")
|
||||
ClsiCookieManager = require("./ClsiCookieManager")
|
||||
|
||||
|
||||
module.exports = CompileController =
|
||||
@@ -109,7 +109,7 @@ module.exports = CompileController =
|
||||
CompileController.proxyToClsiWithLimits(project_id, url, limits, req, res, next)
|
||||
|
||||
proxyToClsiWithLimits: (project_id, url, limits, req, res, next = (error) ->) ->
|
||||
ClsiRequestManager.getCookieJar project_id, (err, jar)->
|
||||
ClsiCookieManager.getCookieJar project_id, (err, jar)->
|
||||
if err?
|
||||
logger.err err:err, "error getting cookie jar for clsi request"
|
||||
return callback(err)
|
||||
|
||||
@@ -126,6 +126,9 @@ module.exports =
|
||||
# cookieDomain: ".sharelatex.dev"
|
||||
cookieName:"sharelatex.sid"
|
||||
|
||||
# this is only used if cookies are used for clsi backend
|
||||
#clsiCookieKey: "clsiserver"
|
||||
|
||||
# Same, but with http auth credentials.
|
||||
httpAuthSiteUrl: 'http://#{httpAuthUser}:#{httpAuthPass}@localhost:3000'
|
||||
|
||||
|
||||
+17
-26
@@ -2,10 +2,10 @@ sinon = require('sinon')
|
||||
chai = require('chai')
|
||||
should = chai.should()
|
||||
expect = chai.expect
|
||||
modulePath = "../../../../app/js/Features/Compile/ClsiRequestManager.js"
|
||||
modulePath = "../../../../app/js/Features/Compile/ClsiCookieManager.js"
|
||||
SandboxedModule = require('sandboxed-module')
|
||||
realRequst = require("request")
|
||||
describe "ClsiRequestManager", ->
|
||||
describe "ClsiCookieManager", ->
|
||||
beforeEach ->
|
||||
@redisMulti =
|
||||
set:sinon.stub()
|
||||
@@ -18,7 +18,7 @@ describe "ClsiRequestManager", ->
|
||||
get: sinon.stub()
|
||||
cookie:realRequst.cookie
|
||||
jar: realRequst.jar
|
||||
@ClsiRequestManager = SandboxedModule.require modulePath, requires:
|
||||
@ClsiCookieManager = SandboxedModule.require modulePath, requires:
|
||||
"redis-sharelatex" :
|
||||
createClient: =>
|
||||
auth:->
|
||||
@@ -39,33 +39,33 @@ describe "ClsiRequestManager", ->
|
||||
|
||||
it "should call get for the key", (done)->
|
||||
@redisMulti.exec.callsArgWith(0, null, ["clsi-7"])
|
||||
@ClsiRequestManager._getServerId @project_id, (err, serverId)=>
|
||||
@ClsiCookieManager._getServerId @project_id, (err, serverId)=>
|
||||
@redisMulti.get.calledWith("clsiserver:#{@project_id}").should.equal true
|
||||
serverId.should.equal "clsi-7"
|
||||
done()
|
||||
|
||||
it "should expire the key", (done)->
|
||||
@redisMulti.exec.callsArgWith(0, null, ["clsi-7"])
|
||||
@ClsiRequestManager._getServerId @project_id, (err, serverId)=>
|
||||
@ClsiCookieManager._getServerId @project_id, (err, serverId)=>
|
||||
@redisMulti.expire.calledWith("clsiserver:#{@project_id}", 60 * 60 * 24 * 7).should.equal true
|
||||
done()
|
||||
|
||||
it "should _getServerIdViaRequest if no key is found", (done)->
|
||||
@ClsiRequestManager._getServerIdViaRequest = sinon.stub().callsArgWith(1)
|
||||
it "should _populateServerIdViaRequest if no key is found", (done)->
|
||||
@ClsiCookieManager._populateServerIdViaRequest = sinon.stub().callsArgWith(1)
|
||||
@redisMulti.exec.callsArgWith(0, null, [])
|
||||
@ClsiRequestManager._getServerId @project_id, (err, serverId)=>
|
||||
@ClsiRequestManager._getServerIdViaRequest.calledWith(@project_id).should.equal true
|
||||
@ClsiCookieManager._getServerId @project_id, (err, serverId)=>
|
||||
@ClsiCookieManager._populateServerIdViaRequest.calledWith(@project_id).should.equal true
|
||||
done()
|
||||
|
||||
|
||||
describe "_getServerIdViaRequest", ->
|
||||
describe "_populateServerIdViaRequest", ->
|
||||
|
||||
it "should make a request to the clsi", (done)->
|
||||
response = "some data"
|
||||
@request.get.callsArgWith(1, null, response)
|
||||
@ClsiRequestManager.setServerId = sinon.stub().callsArgWith(2)
|
||||
@ClsiRequestManager._getServerIdViaRequest @project_id, (err, serverId)=>
|
||||
args = @ClsiRequestManager.setServerId.args[0]
|
||||
@ClsiCookieManager.setServerId = sinon.stub().callsArgWith(2)
|
||||
@ClsiCookieManager._populateServerIdViaRequest @project_id, (err, serverId)=>
|
||||
args = @ClsiCookieManager.setServerId.args[0]
|
||||
args[0].should.equal @project_id
|
||||
args[1].should.deep.equal response
|
||||
done()
|
||||
@@ -73,10 +73,10 @@ describe "ClsiRequestManager", ->
|
||||
describe "setServerId", ->
|
||||
|
||||
it "should set the server id with a ttl", (done)->
|
||||
@ClsiRequestManager._parseServerIdFromResponse = sinon.stub().returns("clsi-8")
|
||||
@ClsiCookieManager._parseServerIdFromResponse = sinon.stub().returns("clsi-8")
|
||||
response = "dsadsakj"
|
||||
@redisMulti.exec.callsArgWith(0)
|
||||
@ClsiRequestManager.setServerId @project_id, response, (err)=>
|
||||
@ClsiCookieManager.setServerId @project_id, response, (err)=>
|
||||
@redisMulti.set.calledWith("clsiserver:#{@project_id}", "clsi-8").should.equal true
|
||||
@redisMulti.expire.calledWith("clsiserver:#{@project_id}", 60 * 60 * 24 * 7).should.equal true
|
||||
done()
|
||||
@@ -85,23 +85,14 @@ describe "ClsiRequestManager", ->
|
||||
describe "getCookieJar", ->
|
||||
|
||||
it "should return a jar with the cookie set populated from redis", (done)->
|
||||
@ClsiRequestManager._getServerId = sinon.stub().callsArgWith(1, null, "clsi-11")
|
||||
@ClsiCookieManager._getServerId = sinon.stub().callsArgWith(1, null, "clsi-11")
|
||||
opts = {}
|
||||
@ClsiRequestManager.getCookieJar @project_id, opts, (err, jar)->
|
||||
@ClsiCookieManager.getCookieJar @project_id, (err, jar)->
|
||||
jar._jar.store.idx["clsi.example.com"]["/"].clsiserver.key.should.equal "clsiserver"
|
||||
jar._jar.store.idx["clsi.example.com"]["/"].clsiserver.value.should.equal "clsi-11"
|
||||
done()
|
||||
|
||||
|
||||
# describe "_parseServerIdFromResponse", ->
|
||||
# it "take the cookie from the response", (done)->
|
||||
|
||||
# a.should.equal
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ SandboxedModule = require('sandboxed-module')
|
||||
describe "ClsiManager", ->
|
||||
beforeEach ->
|
||||
@jar = {cookie:"stuff"}
|
||||
@ClsiRequestManager =
|
||||
@ClsiCookieManager =
|
||||
getCookieJar: sinon.stub().callsArgWith(1, null, @jar)
|
||||
@ClsiManager = SandboxedModule.require modulePath, requires:
|
||||
"settings-sharelatex": @settings =
|
||||
@@ -22,7 +22,7 @@ describe "ClsiManager", ->
|
||||
url: "https://clsipremium.example.com"
|
||||
"../../models/Project": Project: @Project = {}
|
||||
"../Project/ProjectEntityHandler": @ProjectEntityHandler = {}
|
||||
"./ClsiRequestManager": @ClsiRequestManager
|
||||
"./ClsiCookieManager": @ClsiCookieManager
|
||||
"logger-sharelatex": @logger = { log: sinon.stub(), error: sinon.stub(), warn: sinon.stub() }
|
||||
"request": @request = sinon.stub()
|
||||
@project_id = "project-id"
|
||||
|
||||
@@ -23,7 +23,7 @@ describe "CompileController", ->
|
||||
clsi_priority:
|
||||
url: "clsi-priority.example.com"
|
||||
@jar = {cookie:"stuff"}
|
||||
@ClsiRequestManager =
|
||||
@ClsiCookieManager =
|
||||
getCookieJar:sinon.stub().callsArgWith(1, null, @jar)
|
||||
@CompileController = SandboxedModule.require modulePath, requires:
|
||||
"settings-sharelatex": @settings
|
||||
@@ -36,7 +36,7 @@ describe "CompileController", ->
|
||||
"./ClsiManager": @ClsiManager
|
||||
"../Authentication/AuthenticationController": @AuthenticationController = {}
|
||||
"../../infrastructure/RateLimiter":@RateLimiter
|
||||
"./ClsiRequestManager":@ClsiRequestManager
|
||||
"./ClsiCookieManager":@ClsiCookieManager
|
||||
@project_id = "project-id"
|
||||
@user =
|
||||
features:
|
||||
|
||||
Reference in New Issue
Block a user