Ir al contenido

Middleware HTTP

El middleware procesa solicitudes HTTP antes y después del manejo de rutas.

El middleware envuelve manejadores HTTP para agregar lógica de procesamiento. Cada middleware recibe un mapa de opciones y retorna un wrapper de manejador:

middleware:
- cors
- ratelimit
options:
cors.allow.origins: "https://example.com"
ratelimit.requests: "100"

Las opciones usan notación de punto: nombre_middleware.opcion.nombre. El formato heredado con guion bajo es soportado para compatibilidad hacia atrás.

Pre-match se ejecuta antes del matching de rutas—para concerns transversales como CORS y compresión. Post-match se ejecuta después de que la ruta es matcheada—para autorización que necesita info de ruta.
middleware: # Pre-match
- cors
- compress
options:
cors.allow.origins: "*"
post_middleware: # Post-match
- endpoint_firewall
post_options:
endpoint_firewall.action: "access"

Pre-match

Cross-Origin Resource Sharing para solicitudes de navegador.

middleware:
- cors
options:
cors.allow.origins: "https://app.example.com"
cors.allow.credentials: "true"
OpciónPor DefectoDescripción
cors.allow.origins*Orígenes permitidos (separados por coma, soporta *.example.com)
cors.allow.methodsGET,POST,PUT,DELETE,OPTIONS,PATCHMétodos permitidos
cors.allow.headersOrigin,Content-Type,Accept,Authorization,X-Requested-WithHeaders de solicitud permitidos
cors.expose.headers-Headers expuestos al cliente
cors.allow.credentialsfalsePermitir cookies/auth
cors.max.age86400Caché de preflight (segundos)
cors.allow.private.networkfalseAcceso a red privada

Las solicitudes preflight OPTIONS son manejadas automáticamente.


Pre-match

Limitación de tasa con token bucket y tracking por clave.

middleware:
- ratelimit
options:
ratelimit.requests: "100"
ratelimit.window: "1m"
ratelimit.key: "ip"
OpciónPor DefectoDescripción
ratelimit.requests100Solicitudes por ventana
ratelimit.window1mVentana de tiempo
ratelimit.burst20Capacidad de ráfaga
ratelimit.keyipEstrategia de clave
ratelimit.cleanup_interval5mFrecuencia de limpieza
ratelimit.entry_ttl10mExpiración de entrada
ratelimit.max_entries100000Claves máximas rastreadas

Estrategias de clave: ip, header:X-API-Key, query:api_key

Retorna 429 Too Many Requests con headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.


Pre-match

Compresión Gzip para respuestas.

middleware:
- compress
options:
compress.level: "default"
compress.min.length: "1024"
OpciónPor DefectoDescripción
compress.leveldefaultfastest, default, o best
compress.min.length1024Tamaño mínimo de respuesta (bytes)

Solo comprime cuando el cliente envía Accept-Encoding: gzip.


Pre-match

Extrae IP del cliente de headers de proxy.

middleware:
- real_ip
options:
real_ip.trusted.subnets: "10.0.0.0/8,172.16.0.0/12"
OpciónPor DefectoDescripción
real_ip.trusted.subnetsRedes privadasCIDRs de proxy confiables
real_ip.trust_allfalseConfiar en todas las fuentes (inseguro)

Prioridad de header: True-Client-IP > X-Real-IP > X-Forwarded-For


Pre-match

Autenticación basada en token. Ver Seguridad para configuración de almacén de tokens.

middleware:
- token_auth
options:
token_auth.store: "app:tokens"
OpciónPor DefectoDescripción
token_auth.storerequeridoID de registro del almacén de tokens
token_auth.header.nameAuthorizationNombre de header
token_auth.header.prefixBearer Prefijo de header
token_auth.query.paramx-auth-tokenParámetro de query fallback
token_auth.cookie.namex-auth-tokenCookie fallback

Establece actor y scope de seguridad en contexto para middleware downstream. No bloquea solicitudes—la autorización ocurre en middleware firewall.


Pre-match

Métricas HTTP estilo Prometheus. Sin opciones de configuración.

middleware:
- metrics
MétricaTipoDescripción
wippy_http_requests_totalCounterTotal de solicitudes
wippy_http_request_duration_secondsHistogramLatencia de solicitud
wippy_http_requests_in_flightGaugeSolicitudes concurrentes

Post-match

Autorización basada en endpoint matcheado. Requiere actor de token_auth.

post_middleware:
- endpoint_firewall
post_options:
endpoint_firewall.action: "access"
OpciónPor DefectoDescripción
endpoint_firewall.actionaccessAcción de permiso a verificar

Retorna 401 Unauthorized (sin actor) o 403 Forbidden (permiso denegado).


Post-match

Proteger recursos específicos por ID. Útil a nivel de router.

post_middleware:
- resource_firewall
post_options:
resource_firewall.action: "admin"
resource_firewall.target: "app:admin-panel"
OpciónPor DefectoDescripción
resource_firewall.actionaccessAcción de permiso
resource_firewall.targetrequeridoID de registro del recurso

Pre-match

Servir archivos vía header X-Sendfile desde handlers.

middleware:
- sendfile
options:
sendfile.fs: "app:downloads"

El handler establece headers para activar el servicio de archivos:

HeaderDescripción
X-SendfileRuta del archivo dentro del filesystem
X-File-NameNombre de archivo para descarga

Soporta solicitudes de rango para descargas reanudables.


Post-match

Retransmite conexiones WebSocket a procesos. Ver WebSocket Relay.

post_middleware:
- websocket_relay
post_options:
wsrelay.allowed.origins: "https://app.example.com"

Post-match

Transmite Server-Sent Events desde procesos. Ver Server-Sent Events.

post_middleware:
- sse_relay
post_options:
sserelay.allowed.origins: "https://app.example.com"

Pre-match

Registra spans y métricas OpenTelemetry para solicitudes entrantes. Se registra automáticamente cuando OTel está habilitado; de lo contrario actúa como no-op.

middleware:
- otel

No acepta opciones. Funciona junto al middleware metrics; habilita ambos cuando necesites contadores Prometheus y trazas OTel.


El middleware se ejecuta en el orden listado. Secuencia recomendada:

middleware:
- real_ip # 1. Extraer IP real primero
- cors # 2. Manejar preflight CORS
- compress # 3. Configurar compresión de respuesta
- ratelimit # 4. Verificar límites de tasa
- metrics # 5. Registrar métricas
- token_auth # 6. Autenticar solicitudes
post_middleware:
- endpoint_firewall # Autorizar después de match de ruta