Coverage for utils/get_real_ip.py: 77.78%
9 statements
« prev ^ index » next coverage.py v7.9.2, created at 2026-01-25 13:05 +0000
« prev ^ index » next coverage.py v7.9.2, created at 2026-01-25 13:05 +0000
1from fastapi import Request
3def get_real_ip(request: Request) -> str:
4 """
5 Get the real client IP address, prioritizing proxy headers
7 Priority order:
8 1. X-Forwarded-For (takes first IP, usually the original client)
9 2. X-Real-IP (real IP set by nginx)
10 3. request.client.host (direct connection IP)
12 Args:
13 request: FastAPI request object
15 Returns:
16 str: Real client IP address
17 """
18 # First try X-Forwarded-For
19 forwarded_for = request.headers.get("x-forwarded-for")
20 if forwarded_for:
21 return forwarded_for.split(",")[0].strip()
23 # Then try X-Real-IP
24 real_ip = request.headers.get("x-real-ip")
25 if real_ip:
26 return real_ip.strip()
28 # Fallback to direct connection IP
29 return request.client.host if request.client else "unknown"