Blame view

node_modules/http-proxy-middleware/lib/handlers.js 1.94 KB
ce4c83ff   wxy   初始提交
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')
  }