Skip to Content

FastAPI (Python)

FastAPI è progettato per applicazioni web asincrone ad alte prestazioni. Per mantenere tale velocità, integriamo ProxyTracer utilizzando un BaseHTTPMiddleware personalizzato e un client HTTP asincrono (httpx) per garantire che l'event loop non venga mai bloccato.

Il Middleware

Questa implementazione estrae in sicurezza l'IP reale del client, utilizza un pool di connessioni asincrone per interrogare ProxyTracer e restituisce un rigoroso 403 Forbidden se il flag proxy restituisce true.

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") # Inizializza un client asincrono persistente per il connection pooling e la massima velocità self.client = httpx.AsyncClient(timeout=0.5) # Timeout rigoroso di 500ms async def dispatch(self, request: Request, call_next): # 1. Estrai in modo sicuro l'IP reale dietro i load balancer/proxy 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 # Salta gli IP di sviluppo locale if ip and ip not in ["127.0.0.1", "::1", "testclient"]: try: # 2. Interroga l'API ProxyTracer in modo asincrono 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. Interrompi immediatamente la connessione se viene rilevato un proxy 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: registra l'errore di rete e consenti alla richiesta di procedere print(f"ProxyTracer API timeout or failure: {e}") # 4. Il traffico è pulito, procedi all'handler della route return await call_next(request) # Applica il middleware a livello globale app.add_middleware(ProxyTracerMiddleware)

Nota sulle Dipendenze: Questa implementazione richiede la libreria httpx per le richieste HTTP asincrone. Installala tramite pip install httpx.

Ultimo aggiornamento il