Skip to content

Commit

Permalink
Merge pull request #1491 from Dignifiedquire/terinjokes-fix-http-proxy
Browse files Browse the repository at this point in the history
Update http-proxy to 1.11.1
  • Loading branch information
dignifiedquire committed Jul 13, 2015
2 parents 0ce9df6 + 04f408f commit bcce563
Show file tree
Hide file tree
Showing 4 changed files with 237 additions and 149 deletions.
124 changes: 61 additions & 63 deletions lib/middleware/proxy.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,18 @@ var url = require('url')
var httpProxy = require('http-proxy')

var log = require('../logger').create('proxy')
var _ = require('../helper')._

var parseProxyConfig = function (proxies, config) {
var proxyConfig = {}
var endsWithSlash = function (str) {
return str.substr(-1) === '/'
}

if (!proxies) {
return proxyConfig
return []
}

Object.keys(proxies).forEach(function (proxyPath) {
var proxyUrl = proxies[proxyPath]
return _.sortBy(_.map(proxies, function (proxyUrl, proxyPath) {
var proxyDetails = url.parse(proxyUrl)
var pathname = proxyDetails.pathname

Expand All @@ -35,69 +34,69 @@ var parseProxyConfig = function (proxies, config) {
pathname = ''
}

proxyConfig[proxyPath] = {
host: proxyDetails.hostname,
port: proxyDetails.port,
baseProxyUrl: pathname,
https: proxyDetails.protocol === 'https:'
}

if (!proxyConfig[proxyPath].port) {
if (!proxyConfig[proxyPath].host) {
proxyConfig[proxyPath].host = config.hostname
proxyConfig[proxyPath].port = config.port
var hostname = proxyDetails.hostname || config.hostname
var port = proxyDetails.port || config.port ||
(proxyDetails.protocol === 'https:' ? '443' : '80')
var https = proxyDetails.protocol === 'https:'

var proxy = httpProxy.createProxyServer({
target: {
host: hostname,
port: port,
https: https
},
xfwd: true,
secure: config.proxyValidateSSL
})

proxy.on('error', function proxyError (err, req, res) {
if (err.code === 'ECONNRESET' && req.socket.destroyed) {
log.debug('failed to proxy %s (browser hung up the socket)', req.url)
} else {
proxyConfig[proxyPath].port = proxyConfig[proxyPath].https ? '443' : '80'
log.warn('failed to proxy %s (%s)', req.url, err.message)
}
}
})

return proxyConfig
res.destroy()
})

return {
path: proxyPath,
baseUrl: pathname,
host: hostname,
port: port,
https: https,
proxy: proxy
}
}), 'path').reverse()
}

/**
* Returns a handler which understands the proxies and its redirects, along with the proxy to use
* @param proxy A http-proxy.RoutingProxy object with the proxyRequest method
* @param proxies a map of routes to proxy url
* @param proxies An array of proxy record objects
* @param urlRoot The URL root that karma is mounted on
* @return {Function} handler function
*/
var createProxyHandler = function (proxy, proxyConfig, proxyValidateSSL, urlRoot, config) {
var proxies = parseProxyConfig(proxyConfig, config)
var proxiesList = Object.keys(proxies).sort().reverse()

if (!proxiesList.length) {
var createProxyHandler = function (proxies, urlRoot) {
if (!proxies.length) {
var nullProxy = function createNullProxy (request, response, next) {
return next()
}
nullProxy.upgrade = function upgradeNullProxy () {}
return nullProxy
}

proxy.on('proxyError', function (err, req) {
if (err.code === 'ECONNRESET' && req.socket.destroyed) {
log.debug('failed to proxy %s (browser hung up the socket)', req.url)
} else {
log.warn('failed to proxy %s (%s)', req.url, err.message)
}
})

var middleware = function createProxy (request, response, next) {
for (var i = 0; i < proxiesList.length; i++) {
if (request.url.indexOf(proxiesList[i]) === 0) {
var proxiedUrl = proxies[proxiesList[i]]

log.debug('proxying request - %s to %s:%s', request.url, proxiedUrl.host, proxiedUrl.port)
request.url = request.url.replace(proxiesList[i], proxiedUrl.baseProxyUrl)
proxy.proxyRequest(request, response, {
host: proxiedUrl.host,
port: proxiedUrl.port,
target: {https: proxiedUrl.https, rejectUnauthorized: proxyValidateSSL}
})
return
}
var proxyRecord = _.find(proxies, function (p) {
return request.url.indexOf(p.path) === 0
})

if (!proxyRecord) {
return next()
}

return next()
log.debug('proxying request - %s to %s:%s', request.url, proxyRecord.host, proxyRecord.port)
request.url = request.url.replace(proxyRecord.path, proxyRecord.baseUrl)
proxyRecord.proxy.web(request, response)
}

middleware.upgrade = function upgradeProxy (request, socket, head) {
Expand All @@ -106,25 +105,24 @@ var createProxyHandler = function (proxy, proxyConfig, proxyValidateSSL, urlRoot
log.debug('NOT upgrading proxyWebSocketRequest %s', request.url)
return
}
for (var i = 0; i < proxiesList.length; i++) {
if (request.url.indexOf(proxiesList[i]) === 0) {
var proxiedUrl = proxies[proxiesList[i]]
log.debug('upgrade proxyWebSocketRequest %s to %s:%s',
request.url, proxiedUrl.host, proxiedUrl.port)
proxy.proxyWebSocketRequest(request, socket, head,
{host: proxiedUrl.host, port: proxiedUrl.port})
}

var proxyRecord = _.find(proxies, function (p) {
return request.url.indexOf(p.path) === 0
})

if (!proxyRecord) {
return
}

log.debug('upgrade proxyWebSocketRequest %s to %s:%s',
request.url, proxyRecord.host, proxyRecord.port)
request.url = request.url.replace(proxyRecord.path, proxyRecord.baseUrl)
proxyRecord.proxy.ws(request, socket, head)
}

return middleware
}

var createProxyHandlerFactory = function (/* config */ config, /* config.proxies */ proxies,
/* config.proxyValidateSSL */ validateSSL) {
return createProxyHandler(new httpProxy.RoutingProxy({changeOrigin: true}),
proxies, validateSSL, config.urlRoot, config)
exports.create = function (/* config */ config, /* config.proxies */ proxies) {
return createProxyHandler(parseProxyConfig(proxies, config), config.urlRoot)
}
createProxyHandlerFactory.$inject = ['config', 'config.proxies', 'config.proxyValidateSSL']

exports.create = createProxyHandlerFactory
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@
"expand-braces": "^0.1.1",
"glob": "^5.0.10",
"graceful-fs": "^3.0.6",
"http-proxy": "^0.10",
"http-proxy": "^1.11.1",
"lodash": "^3.8.0",
"log4js": "^0.6.25",
"memoizee": "^0.3.8",
Expand All @@ -225,6 +225,7 @@
"LiveScript": "^1.3.0",
"chai": "^2.3.0",
"chai-as-promised": "^5.0.0",
"chai-subset": "^1.0.1",
"coffee-errors": "^0.8.6",
"coffee-script": "^1.9.2",
"cucumber": "^0.4.7",
Expand Down
Loading

0 comments on commit bcce563

Please sign in to comment.