123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- 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');
- }
|