(request)
| 38 | |
| 39 | // https://github.com/filipedeschamps/tabnews.com.br/blob/53482fa8d15c273e9dcda80242eaba4d9f37c9a9/models/ip.js#L4 |
| 40 | export function extractIPFromRequest(request) { |
| 41 | if (isRequestFromCloudflare(request)) { |
| 42 | // Vercel via Cloudflare |
| 43 | return request instanceof Request |
| 44 | ? request.headers.get('cf-connecting-ip') // edge runtime |
| 45 | : request.headers['cf-connecting-ip']; // node runtime |
| 46 | } |
| 47 | let realIp; |
| 48 | |
| 49 | if (request instanceof Request) { |
| 50 | // edge runtime |
| 51 | realIp = isServerlessRuntime |
| 52 | ? request.headers.get('x-vercel-proxied-for')?.split(', ').at(-1) // Vercel |
| 53 | : request.headers.get('x-forwarded-for')?.split(', ').at(-1); // remote development |
| 54 | } else { |
| 55 | // node runtime |
| 56 | realIp = isServerlessRuntime |
| 57 | ? request.headers['x-vercel-proxied-for']?.split(', ').at(-1) // Vercel |
| 58 | : request.headers['x-forwarded-for']?.split(', ').at(-1); // remote development |
| 59 | } |
| 60 | |
| 61 | if (!realIp) { |
| 62 | // local development |
| 63 | realIp = request.socket?.remoteAddress || '127.0.0.1'; |
| 64 | |
| 65 | // Localhost loopback in IPv6 |
| 66 | if (realIp === '::1') { |
| 67 | realIp = '127.0.0.1'; |
| 68 | } |
| 69 | |
| 70 | // IPv4-mapped IPv6 addresses |
| 71 | if (realIp.substr(0, 7) === '::ffff:') { |
| 72 | realIp = realIp.substr(7); |
| 73 | } |
| 74 | } |
| 75 | |
| 76 | return realIp; |
| 77 | } |
no test coverage detected