Blame view

node_modules/http-proxy-middleware/lib/handlers.js 2.13 KB
aaac7fed   liuqimichale   add
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
63
64
65
66
67
68
69
70
71
72
73
74
  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');
  }