summaryrefslogtreecommitdiffstats
path: root/middleware/node_modules/forwarded/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'middleware/node_modules/forwarded/index.js')
-rw-r--r--middleware/node_modules/forwarded/index.js90
1 files changed, 90 insertions, 0 deletions
diff --git a/middleware/node_modules/forwarded/index.js b/middleware/node_modules/forwarded/index.js
new file mode 100644
index 0000000..b2b6bdd
--- /dev/null
+++ b/middleware/node_modules/forwarded/index.js
@@ -0,0 +1,90 @@
+/*!
+ * 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
+}