-
Notifications
You must be signed in to change notification settings - Fork 2
/
get-user-ip.cjs
50 lines (44 loc) · 1.28 KB
/
get-user-ip.cjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
const defaultHeaders = [
'headers.x-client-ip',
'headers.x-real-ip',
'headers.x-forwarded-for',
'connection.remoteAddress',
'socket.remoteAddress',
'connection.socket.remoteAddress'
]
/**
* Get property values dynamically
* @param { Record<string, any> } obj Object
* @param { string } str Get object string
* @returns { string } Object property values
*/
function get_property(obj, str) {
try {
str = str.replace(/\[['"]?([^'"]+)['"]?]/g, '.$1') // Handles array subscripts
let arr = str.split('.')
for (const i of arr) obj = obj[i]
return obj
} catch (e) {}
return null
}
/**
* Obtain real IP address of the client
* @param { IncomingMessage } req Request Object
* @param { string[] } headers [Options] Custom Obtain Request Object Headers Info
* @returns { string } IP - If not, it is returned by default '0.0.0.0'
*/
function get_client_ip(req, headers = []) {
if (Object.prototype.toString.call(req) !== '[object Object]') {
throw new Error('"req" parameter is not legal')
}
headers = [...headers, ...defaultHeaders]
for (const header of headers) {
const ip = get_property(req, header)
if (ip) {
return ip.split(',')[0].trim()
}
}
return '0.0.0.0'
}
module.exports = get_client_ip
module.exports.get_client_ip = get_client_ip