get-client-ip
Version:
Get your client IP address more easily
113 lines (105 loc) • 3.28 kB
JavaScript
'use strict';
var net = require('net');
var isValidIP = function (ip) { return net.isIP(ip) === 4 || net.isIP(ip) === 6; };
var handleArray = function (results) {
if (!results)
return null;
if (!Array.isArray(results))
return null;
if (results.length === 0)
return null;
var ips = results.filter(function (ip) { return typeof ip === "string" && isValidIP(ip.trim()); });
if (ips.length > 0) {
console.log("ips", ips);
return ips[0].trim();
}
return null;
};
var handleResults = function (results) {
if (!results)
return null;
if (Array.isArray(results)) {
var ip = handleArray(results);
if (ip)
return ip;
}
if (typeof results === "string") {
if (results.includes(",")) {
var ip = handleArray(results.split(","));
if (ip)
return ip;
}
if (isValidIP(results))
return results;
}
return null;
};
var customHeaders = [
"x-client-ip",
"x-forwarded-for",
"forwarded-for",
"x-forwarded",
"x-real-ip",
"cf-connecting-ip",
"true-client-ip",
"x-cluster-client-ip",
"fastly-client-ip",
"x-appengine-user-ip",
"Cf-Pseudo-IPv4",
];
var getIPFromHeaders = function (req) {
//Validate headers
if (!("headers" in req))
return null;
if (!req.headers)
return null;
if (typeof req.headers !== "object")
return null;
var headers = req.headers;
//looking for the first IP header req.headers.forwarded
if (headers.forwarded && typeof headers.forwarded === "string") {
var ip = handleResults(headers.forwarded);
if (ip)
return ip;
}
//Looking through each custom header and returns the valid one
for (var _i = 0, customHeaders_1 = customHeaders; _i < customHeaders_1.length; _i++) {
var customHeader = customHeaders_1[_i];
if (headers[customHeader]) {
var ip = handleResults(headers[customHeader]);
if (ip)
return ip;
}
}
return null;
};
var getClientIp = function (request) {
//Validate request
if (!request)
return null;
if (typeof request !== "object")
return null;
var req = request;
//Getting IP from headers
var ip = getIPFromHeaders(req);
if (ip)
return ip;
//Getting IP from socket
if (req.socket && req.socket.remoteAddress && typeof req.socket.remoteAddress === "string") {
if (isValidIP(req.socket.remoteAddress))
return req.socket.remoteAddress;
}
if (req.info && req.info.remoteAddress && typeof req.info.remoteAddress === "string") {
if (isValidIP(req.info.remoteAddress))
return req.info.remoteAddress;
}
if (req.requestContext &&
req.requestContext.identity &&
req.requestContext.identity.sourceIp &&
typeof req.requestContext.identity.sourceIp === "string") {
if (isValidIP(req.requestContext.identity.sourceIp))
return req.requestContext.identity.sourceIp;
}
return null;
};
module.exports = getClientIp;