3 * Copyright(c) 2014-2017 Douglas Christopher Wilson
14 module.exports = forwarded
17 * Get all addresses in the request, using the `X-Forwarded-For` header.
24 function forwarded (req) {
26 throw new TypeError('argument req is required')
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)
34 // return all addresses
39 * Parse the X-Forwarded-For header.
41 * @param {string} header
45 function parse (header) {
46 var end = header.length
48 var start = header.length
50 // gather addresses, backwards
51 for (var i = header.length - 1; i >= 0; i--) {
52 switch (header.charCodeAt(i)) {
60 list.push(header.substring(start, end))
72 list.push(header.substring(start, end))