| import { isIP } from "node:net"; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| export function extractClientIp( |
| xForwardedFor: string | null | undefined, |
| remoteAddress: string | undefined |
| ): string { |
| if (xForwardedFor) { |
| const entries = xForwardedFor.split(","); |
| for (const entry of entries) { |
| const trimmed = entry.trim(); |
| if (trimmed && isIP(trimmed) !== 0) { |
| return trimmed; |
| } |
| } |
| } |
| return remoteAddress?.trim() ?? "unknown"; |
| } |
|
|
| |
| |
| |
| |
| export function getClientIpFromRequest(req: { |
| headers?: Headers | { get?: (n: string) => string | null }; |
| socket?: { remoteAddress?: string }; |
| ip?: string; |
| }): string { |
| |
| const getHeader = (name: string): string | null => { |
| if (!req.headers) return null; |
| if (typeof (req.headers as Headers).get === "function") { |
| return (req.headers as Headers).get(name); |
| } |
| return null; |
| }; |
|
|
| |
| const cfIp = getHeader("cf-connecting-ip"); |
| if (cfIp && isIP(cfIp.trim()) !== 0) return cfIp.trim(); |
|
|
| const xff = getHeader("x-forwarded-for"); |
| const realIp = getHeader("x-real-ip"); |
| const remoteAddress = req.ip ?? req.socket?.remoteAddress; |
|
|
| return extractClientIp(xff ?? realIp, remoteAddress); |
| } |
|
|