Перейти к содержимому

HTTP Middleware

Middleware обрабатывают HTTP-запросы до и после выполнения обработчика маршрута.

Middleware оборачивают HTTP-обработчики, добавляя логику обработки. Каждый middleware получает карту опций и возвращает обёртку обработчика:

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

Опции используют точечную нотацию: middleware_name.option.name. Устаревший формат с подчёркиваниями поддерживается для обратной совместимости.

Pre-match выполняется до сопоставления маршрута — для сквозных задач вроде CORS и сжатия. Post-match выполняется после сопоставления маршрута — для авторизации, которой нужна информация о маршруте.
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 для браузерных запросов.

middleware:
- cors
options:
cors.allow.origins: "https://app.example.com"
cors.allow.credentials: "true"
ОпцияПо умолчаниюОписание
cors.allow.origins*Разрешённые origins (через запятую, поддерживает *.example.com)
cors.allow.methodsGET,POST,PUT,DELETE,OPTIONS,PATCHРазрешённые методы
cors.allow.headersOrigin,Content-Type,Accept,Authorization,X-Requested-WithРазрешённые заголовки запроса
cors.expose.headers-Заголовки, доступные клиенту
cors.allow.credentialsfalseРазрешить cookies/auth
cors.max.age86400Кеш preflight (секунды)
cors.allow.private.networkfalseДоступ к приватной сети

OPTIONS preflight-запросы обрабатываются автоматически.


Pre-match

Ограничение частоты запросов на основе token bucket с отслеживанием по ключам.

middleware:
- ratelimit
options:
ratelimit.requests: "100"
ratelimit.window: "1m"
ratelimit.key: "ip"
ОпцияПо умолчаниюОписание
ratelimit.requests100Запросов за окно
ratelimit.window1mВременное окно
ratelimit.burst20Ёмкость burst
ratelimit.keyipСтратегия ключа
ratelimit.cleanup_interval5mЧастота очистки
ratelimit.entry_ttl10mВремя жизни записи
ratelimit.max_entries100000Макс. отслеживаемых ключей

Стратегии ключа: ip, header:X-API-Key, query:api_key

Возвращает 429 Too Many Requests с заголовками: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.


Pre-match

Gzip-сжатие ответов.

middleware:
- compress
options:
compress.level: "default"
compress.min.length: "1024"
ОпцияПо умолчаниюОписание
compress.leveldefaultfastest, default или best
compress.min.length1024Минимальный размер ответа (байты)

Сжимает только при наличии Accept-Encoding: gzip от клиента.


Pre-match

Извлечение реального IP клиента из заголовков прокси.

middleware:
- real_ip
options:
real_ip.trusted.subnets: "10.0.0.0/8,172.16.0.0/12"
ОпцияПо умолчаниюОписание
real_ip.trusted.subnetsПриватные сетиДоверенные CIDR прокси
real_ip.trust_allfalseДоверять всем источникам (небезопасно)

Приоритет заголовков: True-Client-IP > X-Real-IP > X-Forwarded-For


Pre-match

Аутентификация на основе токенов. См. Безопасность для настройки хранилища токенов.

middleware:
- token_auth
options:
token_auth.store: "app:tokens"
ОпцияПо умолчаниюОписание
token_auth.storeобязательноRegistry ID хранилища токенов
token_auth.header.nameAuthorizationИмя заголовка
token_auth.header.prefixBearer Префикс заголовка
token_auth.query.paramx-auth-tokenQuery-параметр (fallback)
token_auth.cookie.namex-auth-tokenCookie (fallback)

Устанавливает актёра и область безопасности в контексте для последующих middleware. Не блокирует запросы — авторизация происходит в firewall middleware.


Pre-match

HTTP-метрики в стиле Prometheus. Без параметров конфигурации.

middleware:
- metrics
МетрикаТипОписание
wippy_http_requests_totalCounterВсего запросов
wippy_http_request_duration_secondsHistogramЛатентность запросов
wippy_http_requests_in_flightGaugeПараллельные запросы

Post-match

Авторизация на основе сопоставленного эндпоинта. Требует актёра из token_auth.

post_middleware:
- endpoint_firewall
post_options:
endpoint_firewall.action: "access"
ОпцияПо умолчаниюОписание
endpoint_firewall.actionaccessПроверяемое действие

Возвращает 401 Unauthorized (нет актёра) или 403 Forbidden (нет прав).


Post-match

Защита конкретных ресурсов по ID. Полезен на уровне роутера.

post_middleware:
- resource_firewall
post_options:
resource_firewall.action: "admin"
resource_firewall.target: "app:admin-panel"
ОпцияПо умолчаниюОписание
resource_firewall.actionaccessДействие разрешения
resource_firewall.targetобязательноRegistry ID ресурса

Pre-match

Отдача файлов через заголовок X-Sendfile из обработчиков.

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

Обработчик устанавливает заголовки для запуска отдачи файла:

ЗаголовокОписание
X-SendfileПуть к файлу в файловой системе
X-File-NameИмя файла для скачивания

Поддерживает range-запросы для возобновляемой загрузки.


Post-match

Проксирование WebSocket-соединений в процессы. См. WebSocket Relay.

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

Post-match

Потоковая передача Server-Sent Events из процессов. См. Server-Sent Events.

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

Pre-match

Записывает OpenTelemetry spans и метрики для входящих запросов. Регистрируется автоматически, когда OTel включён; иначе работает как no-op.

middleware:
- otel

Не принимает опций. Работает вместе с middleware metrics; включите оба, когда нужны счётчики Prometheus и трассировки OTel.


Middleware выполняются в порядке перечисления. Рекомендуемая последовательность:

middleware:
- real_ip # 1. Сначала извлечь реальный IP
- cors # 2. Обработать CORS preflight
- compress # 3. Настроить сжатие ответа
- ratelimit # 4. Проверить лимиты
- metrics # 5. Записать метрики
- token_auth # 6. Аутентифицировать запросы
post_middleware:
- endpoint_firewall # Авторизовать после сопоставления маршрута