| var _ = require('lodash') |
| var logger = require('./logger').getInstance() |
| |
| module.exports = { |
| init: init, |
| getHandlers: getProxyEventHandlers |
| } |
| |
| function init(proxy, opts) { |
| var handlers = getProxyEventHandlers(opts) |
| |
| _.forIn(handlers, function(handler, eventName) { |
| proxy.on(eventName, handlers[eventName]) |
| }) |
| |
| logger.debug('[HPM] Subscribed to http-proxy events: ', _.keys(handlers)) |
| } |
| |
| function getProxyEventHandlers(opts) { |
| // https://github.com/nodejitsu/node-http-proxy#listening-for-proxy-events |
| var proxyEvents = [ |
| 'error', |
| 'proxyReq', |
| 'proxyReqWs', |
| 'proxyRes', |
| 'open', |
| 'close' |
| ] |
| var handlers = {} |
| |
| _.forEach(proxyEvents, function(event) { |
| // all handlers for the http-proxy events are prefixed with 'on'. |
| // loop through options and try to find these handlers |
| // and add them to the handlers object for subscription in init(). |
| var eventName = _.camelCase('on ' + event) |
| var fnHandler = _.get(opts, eventName) |
| |
| if (_.isFunction(fnHandler)) { |
| handlers[event] = fnHandler |
| } |
| }) |
| |
| // add default error handler in absence of error handler |
| if (!_.isFunction(handlers.error)) { |
| handlers.error = defaultErrorHandler |
| } |
| |
| // add default close handler in absence of close handler |
| if (!_.isFunction(handlers.close)) { |
| handlers.close = logClose |
| } |
| |
| return handlers |
| } |
| |
| function defaultErrorHandler(err, req, res) { |
| var host = req.headers && req.headers.host |
| var code = err.code |
| |
| if (res.writeHead && !res.headersSent) { |
| if (/HPE_INVALID/.test(code)) { |
| res.writeHead(502) |
| } else { |
| switch (code) { |
| case 'ECONNRESET': |
| case 'ENOTFOUND': |
| case 'ECONNREFUSED': |
| res.writeHead(504) |
| break |
| default: |
| res.writeHead(500) |
| } |
| } |
| } |
| |
| res.end('Error occured while trying to proxy to: ' + host + req.url) |
| } |
| |
| function logClose(req, socket, head) { |
| // view disconnected websocket connections |
| logger.info('[HPM] Client disconnected') |
| } |