ProxyManager.coffee 1.2 KB

123456789101112131415161718192021222324252627282930313233343536
  1. settings = require 'settings-sharelatex'
  2. logger = require 'logger-sharelatex'
  3. request = require 'request'
  4. URL = require 'url'
  5. module.exports = ProxyManager =
  6. call: (req, res, next) ->
  7. requestUrl = URL.parse(req.url)
  8. requestPath = requestUrl.pathname # ignore the query part
  9. target = settings.proxyUrls[requestPath]
  10. return next() unless target? # nothing to proxy
  11. targetUrl = makeTargetUrl(target, req.query)
  12. logger.log targetUrl: targetUrl, reqUrl: req.url, "proxying url"
  13. upstream = request(targetUrl)
  14. upstream.on "error", (error) ->
  15. logger.error err: error, "error in ProxyManager"
  16. # TODO: better handling of status code
  17. # see https://github.com/overleaf/write_latex/wiki/Streams-and-pipes-in-Node.js
  18. upstream.pipe(res)
  19. # make a URL from a proxy target.
  20. # if the query is specified, set/replace the target's query with the given query
  21. makeTargetUrl = (target, query) ->
  22. targetUrl = URL.parse(parseSettingUrl(target))
  23. if query? and Object.keys(query).length > 0
  24. targetUrl.query = query
  25. targetUrl.search = null # clear `search` as it takes precedence over `query`
  26. targetUrl.format()
  27. parseSettingUrl = (target) ->
  28. return target if typeof target is 'string'
  29. "#{target.baseUrl}#{target.path or ''}"