Pular para o conteúdo

Middleware HTTP

Middleware processa requisições HTTP antes e depois do tratamento de rotas.

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 executa antes do match de rota - para preocupações transversais como CORS e compressão. Pós-match executa após a rota ser correspondida - para autorização que precisa de info da rota.
middleware: # Pre-match
- cors
- compress
options:
cors.allow.origins: "*"
post_middleware: # Pós-match
- endpoint_firewall
post_options:
endpoint_firewall.action: "access"

Pre-match

Cross-Origin Resource Sharing para requisições de navegador.

middleware:
- cors
options:
cors.allow.origins: "https://app.example.com"
cors.allow.credentials: "true"
OpçãoPadrãoDescrição
cors.allow.origins*Origens permitidas (separadas por vírgula, suporta *.example.com)
cors.allow.methodsGET,POST,PUT,DELETE,OPTIONS,PATCHMétodos permitidos
cors.allow.headersOrigin,Content-Type,Accept,Authorization,X-Requested-WithHeaders de requisição permitidos
cors.expose.headers-Headers expostos ao cliente
cors.allow.credentialsfalsePermite cookies/auth
cors.max.age86400Cache de preflight (segundos)
cors.allow.private.networkfalseAcesso a rede privada

Requisições OPTIONS preflight são tratadas automaticamente.


Pre-match

Rate limiting com token bucket e rastreamento por chave.

middleware:
- ratelimit
options:
ratelimit.requests: "100"
ratelimit.window: "1m"
ratelimit.key: "ip"
OpçãoPadrãoDescrição
ratelimit.requests100Requisições por janela
ratelimit.window1mJanela de tempo
ratelimit.burst20Capacidade de burst
ratelimit.keyipEstratégia de chave
ratelimit.cleanup_interval5mFrequência de limpeza
ratelimit.entry_ttl10mExpiração de entrada
ratelimit.max_entries100000Max 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.


Pre-match

Compressão Gzip para respostas.

middleware:
- compress
options:
compress.level: "default"
compress.min.length: "1024"
OpçãoPadrãoDescrição
compress.leveldefaultfastest, default, ou best
compress.min.length1024Tamanho mínimo de resposta (bytes)

Comprime apenas quando cliente envia Accept-Encoding: gzip.


Pre-match

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çãoPadrãoDescrição
real_ip.trusted.subnetsRedes privadasCIDRs de proxies confiáveis
real_ip.trust_allfalseConfia em todas as fontes (inseguro)

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


Pre-match

Autenticação baseada em token. Veja Segurança para configuração de token store.

middleware:
- token_auth
options:
token_auth.store: "app:tokens"
OpçãoPadrãoDescrição
token_auth.storeobrigatórioID do registro do token store
token_auth.header.nameAuthorizationNome do header
token_auth.header.prefixBearer Prefixo do header
token_auth.query.paramx-auth-tokenFallback de parâmetro query
token_auth.cookie.namex-auth-tokenFallback 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.


Pre-match

Métricas HTTP estilo Prometheus. Sem opções de configuração.

middleware:
- metrics
MétricaTipoDescrição
wippy_http_requests_totalCounterTotal de requisições
wippy_http_request_duration_secondsHistogramLatência de requisição
wippy_http_requests_in_flightGaugeRequisições concorrentes

Pós-match

Autorização baseada no endpoint correspondido. Requer ator do token_auth.

post_middleware:
- endpoint_firewall
post_options:
endpoint_firewall.action: "access"
OpçãoPadrãoDescrição
endpoint_firewall.actionaccessAção de permissão a verificar

Retorna 401 Unauthorized (sem ator) ou 403 Forbidden (permissão negada).


Pós-match

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çãoPadrãoDescrição
resource_firewall.actionaccessAção de permissão
resource_firewall.targetobrigatórioID do registro do recurso

Pre-match

Serve arquivos via header X-Sendfile de handlers.

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

Handler define headers para disparar serviço de arquivo:

HeaderDescrição
X-SendfileCaminho do arquivo dentro do filesystem
X-File-NameNome do arquivo para download

Suporta requisições de range para downloads resumíveis.


Pós-match

Retransmite conexões WebSocket para processos. Veja Relay WebSocket.

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

Post-match

Transmite Server-Sent Events de processos. Veja Server-Sent Events.

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

Pre-match

Registra spans e métricas OpenTelemetry para requisições recebidas. Registrado automaticamente quando OTel está habilitado; caso contrário atua como no-op.

middleware:
- otel

Não aceita opções. Funciona junto com o middleware metrics; habilite ambos quando precisar de contadores Prometheus e traces OTel.


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