Skip to Content

FastAPI (Python)

FastAPI is gebouwd voor high-performance, asynchrone webapplicaties. Om die snelheid te behouden, integreren we ProxyTracer met behulp van een custom BaseHTTPMiddleware 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