FastAPI (Python)
FastAPI is gebouwd voor high-performance, asynchrone webapplicaties. Om die snelheid te behouden, integreren we ProxyTracer met behulp van een customBaseHTTPMiddleware en een asynchrone HTTP-client (httpx) om ervoor te zorgen dat de event loop nooit blokkeert.
De Middleware
Deze implementatie extraheert veilig het echte client-IP, maakt gebruik van een asynchrone connection pool om ProxyTracer te bevragen en retourneert een strikte 403 Forbidden als de proxy flag true is.
import os
import httpx
from fastapi import FastAPI, Request, status
from fastapi.responses import JSONResponse
from starlette.middleware.base import BaseHTTPMiddleware
app = FastAPI()
class ProxyTracerMiddleware(BaseHTTPMiddleware):
def __init__(self, app):
super().__init__(app)
self.api_key = os.getenv("PROXYTRACER_API_KEY")
# Initialiseer een persistente asynchrone client voor connection pooling en maximale snelheid
self.client = httpx.AsyncClient(timeout=0.5) # Strikte time-out van 500ms
async def dispatch(self, request: Request, call_next):
# 1. Extraheer het echte IP-adres veilig achter load balancers/proxy's
forwarded_for = request.headers.get("x-forwarded-for")
if forwarded_for:
ip = forwarded_for.split(",")[0].strip()
else:
ip = request.client.host if request.client else None
# Sla IP-adressen voor lokale ontwikkeling over
if ip and ip not in ["127.0.0.1", "::1", "testclient"]:
try:
# 2. Raadpleeg de ProxyTracer API asynchroon
response = await self.client.get(
f"https://api.proxytracer.com/v1/check/{ip}",
headers={"Authorization": f"Bearer {self.api_key}"}
)
if response.status_code == 200:
data = response.json()
# 3. Verbreek de verbinding onmiddellijk als er een proxy wordt gedetecteerd
if data.get("proxy") is True:
return JSONResponse(
status_code=status.HTTP_403_FORBIDDEN,
content={"error": "Access Denied: VPN or Proxy detected."}
)
except httpx.RequestError as e:
# Fail open: Log de netwerkfout en laat het verzoek doorgaan
print(f"ProxyTracer API timeout or failure: {e}")
# 4. Verkeer is schoon, ga door naar de route-handler
return await call_next(request)
# Pas de middleware globaal toe
app.add_middleware(ProxyTracerMiddleware)Dependency Opmerking: Deze implementatie vereist de httpx-library voor asynchrone HTTP-requests. Installeer deze via pip install httpx.
Laatst bijgewerkt op