| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 | 
							- /*!
 
-  * forwarded
 
-  * Copyright(c) 2014-2017 Douglas Christopher Wilson
 
-  * MIT Licensed
 
-  */
 
- 'use strict'
 
- /**
 
-  * Module exports.
 
-  * @public
 
-  */
 
- module.exports = forwarded
 
- /**
 
-  * Get all addresses in the request, using the `X-Forwarded-For` header.
 
-  *
 
-  * @param {object} req
 
-  * @return {array}
 
-  * @public
 
-  */
 
- function forwarded (req) {
 
-   if (!req) {
 
-     throw new TypeError('argument req is required')
 
-   }
 
-   // simple header parsing
 
-   var proxyAddrs = parse(req.headers['x-forwarded-for'] || '')
 
-   var socketAddr = getSocketAddr(req)
 
-   var addrs = [socketAddr].concat(proxyAddrs)
 
-   // return all addresses
 
-   return addrs
 
- }
 
- /**
 
-  * Get the socket address for a request.
 
-  *
 
-  * @param {object} req
 
-  * @return {string}
 
-  * @private
 
-  */
 
- function getSocketAddr (req) {
 
-   return req.socket
 
-     ? req.socket.remoteAddress
 
-     : req.connection.remoteAddress
 
- }
 
- /**
 
-  * Parse the X-Forwarded-For header.
 
-  *
 
-  * @param {string} header
 
-  * @private
 
-  */
 
- function parse (header) {
 
-   var end = header.length
 
-   var list = []
 
-   var start = header.length
 
-   // gather addresses, backwards
 
-   for (var i = header.length - 1; i >= 0; i--) {
 
-     switch (header.charCodeAt(i)) {
 
-       case 0x20: /*   */
 
-         if (start === end) {
 
-           start = end = i
 
-         }
 
-         break
 
-       case 0x2c: /* , */
 
-         if (start !== end) {
 
-           list.push(header.substring(start, end))
 
-         }
 
-         start = end = i
 
-         break
 
-       default:
 
-         start = i
 
-         break
 
-     }
 
-   }
 
-   // final address
 
-   if (start !== end) {
 
-     list.push(header.substring(start, end))
 
-   }
 
-   return list
 
- }
 
 
  |