HTTP Middleware
HTTP Middleware
Заголовок раздела «HTTP Middleware»Middleware обрабатывают HTTP-запросы до и после выполнения обработчика маршрута.
Как работают middleware
Заголовок раздела «Как работают middleware»Middleware оборачивают HTTP-обработчики, добавляя логику обработки. Каждый middleware получает карту опций и возвращает обёртку обработчика:
middleware: - cors - ratelimitoptions: cors.allow.origins: "https://example.com" ratelimit.requests: "100"Опции используют точечную нотацию: middleware_name.option.name. Устаревший формат с подчёркиваниями поддерживается для обратной совместимости.
Pre-Match vs Post-Match
Заголовок раздела «Pre-Match vs Post-Match»middleware: # Pre-match - cors - compressoptions: cors.allow.origins: "*"
post_middleware: # Post-match - endpoint_firewallpost_options: endpoint_firewall.action: "access"Доступные middleware
Заголовок раздела «Доступные middleware»CORS {#cors}
Заголовок раздела «CORS {#cors}»Cross-Origin Resource Sharing для браузерных запросов.
middleware: - corsoptions: cors.allow.origins: "https://app.example.com" cors.allow.credentials: "true"| Опция | По умолчанию | Описание |
|---|---|---|
cors.allow.origins | * | Разрешённые origins (через запятую, поддерживает *.example.com) |
cors.allow.methods | GET,POST,PUT,DELETE,OPTIONS,PATCH | Разрешённые методы |
cors.allow.headers | Origin,Content-Type,Accept,Authorization,X-Requested-With | Разрешённые заголовки запроса |
cors.expose.headers | - | Заголовки, доступные клиенту |
cors.allow.credentials | false | Разрешить cookies/auth |
cors.max.age | 86400 | Кеш preflight (секунды) |
cors.allow.private.network | false | Доступ к приватной сети |
OPTIONS preflight-запросы обрабатываются автоматически.
Rate Limiting {#ratelimit}
Заголовок раздела «Rate Limiting {#ratelimit}»Ограничение частоты запросов на основе token bucket с отслеживанием по ключам.
middleware: - ratelimitoptions: ratelimit.requests: "100" ratelimit.window: "1m" ratelimit.key: "ip"| Опция | По умолчанию | Описание |
|---|---|---|
ratelimit.requests | 100 | Запросов за окно |
ratelimit.window | 1m | Временное окно |
ratelimit.burst | 20 | Ёмкость burst |
ratelimit.key | ip | Стратегия ключа |
ratelimit.cleanup_interval | 5m | Частота очистки |
ratelimit.entry_ttl | 10m | Время жизни записи |
ratelimit.max_entries | 100000 | Макс. отслеживаемых ключей |
Стратегии ключа: ip, header:X-API-Key, query:api_key
Возвращает 429 Too Many Requests с заголовками: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
Сжатие {#compress}
Заголовок раздела «Сжатие {#compress}»Gzip-сжатие ответов.
middleware: - compressoptions: compress.level: "default" compress.min.length: "1024"| Опция | По умолчанию | Описание |
|---|---|---|
compress.level | default | fastest, default или best |
compress.min.length | 1024 | Минимальный размер ответа (байты) |
Сжимает только при наличии Accept-Encoding: gzip от клиента.
Real IP {#real_ip}
Заголовок раздела «Real IP {#real_ip}»Извлечение реального IP клиента из заголовков прокси.
middleware: - real_ipoptions: real_ip.trusted.subnets: "10.0.0.0/8,172.16.0.0/12"| Опция | По умолчанию | Описание |
|---|---|---|
real_ip.trusted.subnets | Приватные сети | Доверенные CIDR прокси |
real_ip.trust_all | false | Доверять всем источникам (небезопасно) |
Приоритет заголовков: True-Client-IP > X-Real-IP > X-Forwarded-For
Token Auth {#token_auth}
Заголовок раздела «Token Auth {#token_auth}»Аутентификация на основе токенов. См. Безопасность для настройки хранилища токенов.
middleware: - token_authoptions: token_auth.store: "app:tokens"| Опция | По умолчанию | Описание |
|---|---|---|
token_auth.store | обязательно | Registry ID хранилища токенов |
token_auth.header.name | Authorization | Имя заголовка |
token_auth.header.prefix | Bearer | Префикс заголовка |
token_auth.query.param | x-auth-token | Query-параметр (fallback) |
token_auth.cookie.name | x-auth-token | Cookie (fallback) |
Устанавливает актёра и область безопасности в контексте для последующих middleware. Не блокирует запросы — авторизация происходит в firewall middleware.
Метрики {#metrics}
Заголовок раздела «Метрики {#metrics}»HTTP-метрики в стиле Prometheus. Без параметров конфигурации.
middleware: - metrics| Метрика | Тип | Описание |
|---|---|---|
wippy_http_requests_total | Counter | Всего запросов |
wippy_http_request_duration_seconds | Histogram | Латентность запросов |
wippy_http_requests_in_flight | Gauge | Параллельные запросы |
Endpoint Firewall {#endpoint_firewall}
Заголовок раздела «Endpoint Firewall {#endpoint_firewall}»Авторизация на основе сопоставленного эндпоинта. Требует актёра из token_auth.
post_middleware: - endpoint_firewallpost_options: endpoint_firewall.action: "access"| Опция | По умолчанию | Описание |
|---|---|---|
endpoint_firewall.action | access | Проверяемое действие |
Возвращает 401 Unauthorized (нет актёра) или 403 Forbidden (нет прав).
Resource Firewall {#resource_firewall}
Заголовок раздела «Resource Firewall {#resource_firewall}»Защита конкретных ресурсов по ID. Полезен на уровне роутера.
post_middleware: - resource_firewallpost_options: resource_firewall.action: "admin" resource_firewall.target: "app:admin-panel"| Опция | По умолчанию | Описание |
|---|---|---|
resource_firewall.action | access | Действие разрешения |
resource_firewall.target | обязательно | Registry ID ресурса |
Sendfile {#sendfile}
Заголовок раздела «Sendfile {#sendfile}»Отдача файлов через заголовок X-Sendfile из обработчиков.
middleware: - sendfileoptions: sendfile.fs: "app:downloads"Обработчик устанавливает заголовки для запуска отдачи файла:
| Заголовок | Описание |
|---|---|
X-Sendfile | Путь к файлу в файловой системе |
X-File-Name | Имя файла для скачивания |
Поддерживает range-запросы для возобновляемой загрузки.
WebSocket Relay {#websocket_relay}
Заголовок раздела «WebSocket Relay {#websocket_relay}»Проксирование WebSocket-соединений в процессы. См. WebSocket Relay.
post_middleware: - websocket_relaypost_options: wsrelay.allowed.origins: "https://app.example.com"SSE Relay {#sse_relay}
Заголовок раздела «SSE Relay {#sse_relay}»Потоковая передача Server-Sent Events из процессов. См. Server-Sent Events.
post_middleware: - sse_relaypost_options: sserelay.allowed.origins: "https://app.example.com"OpenTelemetry {#otel}
Заголовок раздела «OpenTelemetry {#otel}»Записывает OpenTelemetry spans и метрики для входящих запросов. Регистрируется автоматически, когда OTel включён; иначе работает как no-op.
middleware: - otelНе принимает опций. Работает вместе с middleware metrics; включите оба, когда нужны счётчики Prometheus и трассировки OTel.
Порядок middleware
Заголовок раздела «Порядок middleware»Middleware выполняются в порядке перечисления. Рекомендуемая последовательность:
middleware: - real_ip # 1. Сначала извлечь реальный IP - cors # 2. Обработать CORS preflight - compress # 3. Настроить сжатие ответа - ratelimit # 4. Проверить лимиты - metrics # 5. Записать метрики - token_auth # 6. Аутентифицировать запросы
post_middleware: - endpoint_firewall # Авторизовать после сопоставления маршрутаСм. также
Заголовок раздела «См. также»- Маршрутизация — конфигурация роутера
- Безопасность — хранилища токенов и политики
- WebSocket Relay — обработка WebSocket
- Server-Sent Events — потоковая передача SSE
- Терминал — терминальный сервис