actionhero
Version:
The reusable, scalable, and quick node.js API server for stateless and stateful applications
52 lines (51 loc) • 1.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseHeadersForClientAddress = parseHeadersForClientAddress;
const parseIPv6URI_1 = require("./parseIPv6URI");
/**
* Return ip and port information if defined in the header
*/
function parseHeadersForClientAddress(headers) {
let ip;
let port;
if (headers["x-forwarded-for"]) {
let parts;
let forwardedIp = Array.isArray(headers["x-forwarded-for"])
? headers["x-forwarded-for"][0].split(",")[0]
: headers["x-forwarded-for"].split(",")[0];
if (forwardedIp.indexOf(".") >= 0 ||
(forwardedIp.indexOf(".") < 0 && forwardedIp.indexOf(":") < 0)) {
// IPv4
forwardedIp = forwardedIp.replace("::ffff:", ""); // remove any IPv6 information, ie: '::ffff:127.0.0.1'
parts = forwardedIp.split(":");
if (parts[0]) {
ip = parts[0];
}
if (parts[1]) {
port = parts[1];
}
}
else {
// IPv6
parts = (0, parseIPv6URI_1.parseIPv6URI)(forwardedIp);
if (parts.host) {
ip = parts.host;
}
if (parts.port) {
port = parts.port;
}
}
}
if (headers["x-forwarded-port"]) {
port = Array.isArray(headers["x-forwarded-port"])
? headers["x-forwarded-port"][0]
: headers["x-forwarded-port"];
}
if (headers["x-real-ip"]) {
// https://distinctplace.com/2014/04/23/story-behind-x-forwarded-for-and-x-real-ip-headers/
ip = Array.isArray(headers["x-real-ip"])
? headers["x-real-ip"][0]
: headers["x-real-ip"];
}
return { ip, port };
}