Middleware HTTP
Middleware processa requisições HTTP antes e depois do tratamento de rotas.
Como Middleware Funciona
Middleware encapsula handlers HTTP para adicionar lógica de processamento. Cada middleware recebe um mapa de opções e retorna um wrapper de handler:
middleware:
- cors
- ratelimit
options:
cors.allow.origins: "https://example.com"
ratelimit.requests: "100"
Opções usam notação de ponto: nome_middleware.opcao.nome. Formato legado com underscore é suportado para compatibilidade retroativa.
Pre-Match vs Pós-Match
middleware: # Pre-match
- cors
- compress
options:
cors.allow.origins: "*"
post_middleware: # Pós-match
- endpoint_firewall
post_options:
endpoint_firewall.action: "access"
Middleware Disponível
CORS {#cors}
Cross-Origin Resource Sharing para requisições de navegador.
middleware:
- cors
options:
cors.allow.origins: "https://app.example.com"
cors.allow.credentials: "true"
| Opção | Padrão | Descrição |
|---|---|---|
cors.allow.origins |
* |
Origens permitidas (separadas por vírgula, suporta *.example.com) |
cors.allow.methods |
GET,POST,PUT,DELETE,OPTIONS,PATCH |
Métodos permitidos |
cors.allow.headers |
Origin,Content-Type,Accept,Authorization,X-Requested-With |
Headers de requisição permitidos |
cors.expose.headers |
- | Headers expostos ao cliente |
cors.allow.credentials |
false |
Permite cookies/auth |
cors.max.age |
86400 |
Cache de preflight (segundos) |
cors.allow.private.network |
false |
Acesso a rede privada |
Requisições OPTIONS preflight são tratadas automaticamente.
Rate Limiting {#ratelimit}
Rate limiting com token bucket e rastreamento por chave.
middleware:
- ratelimit
options:
ratelimit.requests: "100"
ratelimit.window: "1m"
ratelimit.key: "ip"
| Opção | Padrão | Descrição |
|---|---|---|
ratelimit.requests |
100 |
Requisições por janela |
ratelimit.window |
1m |
Janela de tempo |
ratelimit.burst |
20 |
Capacidade de burst |
ratelimit.key |
ip |
Estratégia de chave |
ratelimit.cleanup_interval |
5m |
Frequência de limpeza |
ratelimit.entry_ttl |
10m |
Expiração de entrada |
ratelimit.max_entries |
100000 |
Max chaves rastreadas |
Estratégias de chave: ip, header:X-API-Key, query:api_key
Retorna 429 Too Many Requests com headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
Compressão {#compress}
Compressão Gzip para respostas.
middleware:
- compress
options:
compress.level: "default"
compress.min.length: "1024"
| Opção | Padrão | Descrição |
|---|---|---|
compress.level |
default |
fastest, default, ou best |
compress.min.length |
1024 |
Tamanho mínimo de resposta (bytes) |
Comprime apenas quando cliente envia Accept-Encoding: gzip.
Real IP {#real_ip}
Extrai IP do cliente de headers de proxy.
middleware:
- real_ip
options:
real_ip.trusted.subnets: "10.0.0.0/8,172.16.0.0/12"
| Opção | Padrão | Descrição |
|---|---|---|
real_ip.trusted.subnets |
Redes privadas | CIDRs de proxies confiáveis |
real_ip.trust_all |
false |
Confia em todas as fontes (inseguro) |
Prioridade de header: True-Client-IP > X-Real-IP > X-Forwarded-For
Token Auth {#token_auth}
Autenticação baseada em token. Veja Segurança para configuração de token store.
middleware:
- token_auth
options:
token_auth.store: "app:tokens"
| Opção | Padrão | Descrição |
|---|---|---|
token_auth.store |
obrigatório | ID do registro do token store |
token_auth.header.name |
Authorization |
Nome do header |
token_auth.header.prefix |
Bearer |
Prefixo do header |
token_auth.query.param |
x-auth-token |
Fallback de parâmetro query |
token_auth.cookie.name |
x-auth-token |
Fallback de cookie |
Define ator e escopo de segurança no contexto para middleware downstream. Não bloqueia requisições - autorização acontece em middleware de firewall.
Métricas {#metrics}
Métricas HTTP estilo Prometheus. Sem opções de configuração.
middleware:
- metrics
| Métrica | Tipo | Descrição |
|---|---|---|
wippy_http_requests_total |
Counter | Total de requisições |
wippy_http_request_duration_seconds |
Histogram | Latência de requisição |
wippy_http_requests_in_flight |
Gauge | Requisições concorrentes |
Firewall de Endpoint {#endpoint_firewall}
Autorização baseada no endpoint correspondido. Requer ator do token_auth.
post_middleware:
- endpoint_firewall
post_options:
endpoint_firewall.action: "access"
| Opção | Padrão | Descrição |
|---|---|---|
endpoint_firewall.action |
access |
Ação de permissão a verificar |
Retorna 401 Unauthorized (sem ator) ou 403 Forbidden (permissão negada).
Firewall de Recurso {#resource_firewall}
Protege recursos específicos por ID. Útil no nível de roteador.
post_middleware:
- resource_firewall
post_options:
resource_firewall.action: "admin"
resource_firewall.target: "app:admin-panel"
| Opção | Padrão | Descrição |
|---|---|---|
resource_firewall.action |
access |
Ação de permissão |
resource_firewall.target |
obrigatório | ID do registro do recurso |
Sendfile {#sendfile}
Serve arquivos via header X-Sendfile de handlers.
middleware:
- sendfile
options:
sendfile.fs: "app:downloads"
Handler define headers para disparar serviço de arquivo:
| Header | Descrição |
|---|---|
X-Sendfile |
Caminho do arquivo dentro do filesystem |
X-File-Name |
Nome do arquivo para download |
Suporta requisições de range para downloads resumíveis.
Relay WebSocket {#websocket_relay}
Retransmite conexões WebSocket para processos. Veja Relay WebSocket.
post_middleware:
- websocket_relay
post_options:
wsrelay.allowed.origins: "https://app.example.com"
Ordem de Middleware
Middleware executa na ordem listada. Sequência recomendada:
middleware:
- real_ip # 1. Extrai IP real primeiro
- cors # 2. Trata preflight CORS
- compress # 3. Configura compressão de resposta
- ratelimit # 4. Verifica limites de taxa
- metrics # 5. Registra métricas
- token_auth # 6. Autentica requisições
post_middleware:
- endpoint_firewall # Autoriza após match de rota
Veja Também
- Roteamento - Configuração de roteador
- Segurança - Token stores e políticas
- Relay WebSocket - Tratamento de WebSocket
- Terminal - Serviço de terminal