second
[josuexyz/.git] / node_modules / forwarded / index.js
1 /*!
2  * forwarded
3  * Copyright(c) 2014-2017 Douglas Christopher Wilson
4  * MIT Licensed
5  */
6
7 'use strict'
8
9 /**
10  * Module exports.
11  * @public
12  */
13
14 module.exports = forwarded
15
16 /**
17  * Get all addresses in the request, using the `X-Forwarded-For` header.
18  *
19  * @param {object} req
20  * @return {array}
21  * @public
22  */
23
24 function forwarded (req) {
25   if (!req) {
26     throw new TypeError('argument req is required')
27   }
28
29   // simple header parsing
30   var proxyAddrs = parse(req.headers['x-forwarded-for'] || '')
31   var socketAddr = req.connection.remoteAddress
32   var addrs = [socketAddr].concat(proxyAddrs)
33
34   // return all addresses
35   return addrs
36 }
37
38 /**
39  * Parse the X-Forwarded-For header.
40  *
41  * @param {string} header
42  * @private
43  */
44
45 function parse (header) {
46   var end = header.length
47   var list = []
48   var start = header.length
49
50   // gather addresses, backwards
51   for (var i = header.length - 1; i >= 0; i--) {
52     switch (header.charCodeAt(i)) {
53       case 0x20: /*   */
54         if (start === end) {
55           start = end = i
56         }
57         break
58       case 0x2c: /* , */
59         if (start !== end) {
60           list.push(header.substring(start, end))
61         }
62         start = end = i
63         break
64       default:
65         start = i
66         break
67     }
68   }
69
70   // final address
71   if (start !== end) {
72     list.push(header.substring(start, end))
73   }
74
75   return list
76 }