# all files / http-proxy-middleware/lib/ handlers.js

100% Statements 28/28
100% Branches 12/12
100% Functions 6/6
100% Lines 28/28

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    631×
    1×

    1×

    1×
    41×

    41×
    85×

    41×

    1×

    48×
    48×

    48×

    288×
    288×

    288×
    17×

    48×
    44×

    48×
    46×

    48×

    1×
    5×

    5×
    3×

    5×

    1×

    4×

     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);

        if (res.writeHead && !res.headersSent) {
            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');
    }