Skip to content
Snippets Groups Projects
Select Git revision
  • 1d9ddbd9912a87f3ae7516526637f6836628a1d5
  • master default protected
  • remove-event-tracking-fix-adblocker
  • ja-oss-test
  • sk-pin-chai-dependency
  • secure-headers
  • sk-add-csrf-acceptance-test
  • ja-handle-commands-in-arguments
  • ja-include-token-in-project-schema
  • sk-fix-project-feature-loading
  • ho-csrf-acceptence-tests
  • revert-580-ja-import-collaborators
  • ja-import-projects
  • ja-import-collaborators
  • sk-tc-toggle-access-control
  • ja-per-user-track-changes
  • ja-overleaf-oauth
  • ja-brand-prefix-config
  • ja-overleaf-styling
  • ho-overleaf-styling
  • ja-update-ace
  • v0.2.0
  • v0.1.4
  • v0.1.3
  • v0.1.2
  • v0.1.0
26 results

ProxyManager.coffee

Blame
  • user avatar
    Tim Alby authored and David Mehren committed
    1d9ddbd9
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    ProxyManager.coffee 1.21 KiB
    settings = require 'settings-sharelatex'
    logger = require 'logger-sharelatex'
    request = require 'request'
    URL = require 'url'
    
    module.exports = ProxyManager =
    	call: (req, res, next) ->
    		requestUrl = URL.parse(req.url)
    		requestPath = requestUrl.pathname # ignore the query part
    
    		target = settings.proxyUrls[requestPath]
    		return next() unless target? # nothing to proxy
    
    		targetUrl = makeTargetUrl(target, req.query)
    		logger.log targetUrl: targetUrl, reqUrl: req.url, "proxying url"
    
    		upstream = request(targetUrl)
    		upstream.on "error", (error) ->
    			logger.error err: error, "error in ProxyManager"
    
    		# TODO: better handling of status code
    		# see https://github.com/overleaf/write_latex/wiki/Streams-and-pipes-in-Node.js
    		upstream.pipe(res)
    
    # make a URL from a proxy target.
    # if the query is specified, set/replace the target's query with the given query
    makeTargetUrl = (target, query) ->
    	targetUrl = URL.parse(parseSettingUrl(target))
    	if query? and Object.keys(query).length > 0
    		targetUrl.query = query
    		targetUrl.search = null # clear `search` as it takes precedence over `query`
    	targetUrl.format()
    
    parseSettingUrl = (target) ->
    	return target if typeof target is 'string'
    	"#{target.baseUrl}#{target.path or ''}"