You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					91 lines
				
				1.5 KiB
			
		
		
			
		
	
	
					91 lines
				
				1.5 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								/*!
							 | 
						||
| 
								 | 
							
								 * 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
							 | 
						||
| 
								 | 
							
								}
							 |