zhangjian
2023-06-05 0976d2d0f90cff460cedfdc8bd74e98c2c31a58c
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
75
76
77
78
79
80
81
82
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')
}