83 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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')
 | |
| }
 |