
Открытая тестовая платформа, которая проверяет HTTP/1.1 серверы на соответствие требованиям RFC 9110/9112, векторы смаглинга и обработку некорректного ввода. Добавьте свой фреймворк, получайте результаты проверки на соответствие автоматически.
Http11Probe — это инструмент для проверки соответствия и безопасности HTTP/1.1-серверов. Он отправляет серверу через сырые TCP-сокеты некорректные, неоднозначные и чрезмерно большие запросы и проверяет ответы на соответствие требованиям RFC 9110 и RFC 9112. Это такие неудобные случаи, как строки LF без CR, устаревшее сворачивание строк, контрабанда запросов CL/TE, трюки с фреймингом chunk, чрезмерно большие заголовки и нулевые байты, где строгий и либеральный парсеры начинают расходиться.
Те же 215 тестов запускаются на 41 эталонном сервере, написанном на 12 языках, от Nginx, Apache и Envoy до Kestrel, Gin, Actix и встроенных серверов в Node, Bun и Deno. Каждый результат оценивается по формулировкам MUST/SHOULD/MAY из спецификации и маркируется как Pass, Fail или Warn. Warn означает, что RFC допускает как строгое, так и либеральное поведение, поэтому ни то, ни другое не является ошибкой.
Полную документацию, глоссарий для каждого теста со ссылками на RFC и матрицу результатов для всех серверов в реальном времени вы найдете на http-probe.com.
Зонд не привязан к конкретной цели. Он тестирует любой HTTP/1.1-сервер, который уже слушает на --host:--port, и не имеет флага для выбора фреймворка. Сначала запустите сервер (или позвольте probe-local.sh сделать это за вас), затем нацельте на него зонд.
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 8080
| Флаг | Описание | По умолчанию |
|---|---|---|
--host | Имя хоста или IP-адрес цели | localhost |
--port | Номер порта цели | 8080 |
--category | Запускать только тесты из этой категории (Compliance, Smuggling, MalformedInput, Normalization, Cookies, Capabilities) | все |
--test | Запускать только определенные ID тестов (без учета регистра, повторяемый) | все |
--timeout | Таймаут подключения и чтения в секундах на тест | 5 |
--output | Записать результаты в JSON-файл | нет |
--verbose, -v | Выводить сырой ответ сервера для каждого теста | выкл |
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 8080 --output results.json
Запуск определенных тестов:
dotnet run --project src/Http11Probe.Cli -- --test SMUG-CL-TE-BOTH --test SMUG-DUPLICATE-CL
Результаты выводятся на консоль по мере завершения каждого теста, с итоговой сводкой в конце:
Score: 97/97 19 warnings (146 tests, 35.5s)
Зонд только отправляет запросы, он не запускает серверы. Чтобы проверить один из встроенных серверов в src/Servers/, используйте scripts/probe-local.sh. Он делает то же самое, что и CI-конвейер: собирает Docker-образ сервера, запускает его на --network host, ожидает его готовности, тестирует, затем останавливает.
# Проверка одного сервера по имени каталога в src/Servers/, например ActixServer
scripts/probe-local.sh --server ActixServer
# Проверка всех встроенных серверов
scripts/probe-local.sh --all
Значение --server — это имя каталога (ActixServer), а не отображаемое имя (Actix). Если вашему Docker-демону требуются права root, добавьте --docker-sudo, чтобы не запускать весь скрипт с sudo:
scripts/probe-local.sh --server ActixServer --docker-sudo
| Флаг | Описание |
|---|---|
--server <Dir> | Проверить один сервер по имени каталога в src/Servers/ (например, NginxServer) |
--all | Проверить все серверы в src/Servers/*/probe.json |
--port <Port> | Целевой порт (по умолчанию: 8080) |
--skip-build | Пропустить dotnet build (предполагается, что уже существует сборка Release) |
--verbose | Передать --verbose в CLI |
--docker-sudo | Запускать команды Docker через sudo (позволяет запускать скрипт без sudo) |
-h, --help | Показать справку |
Скрипт записывает probe-<ServerDir>.json (по одному на сервер), а также probe-data.js и docs/static/probe/data.js для локального отображения. Вам понадобятся jq, docker, curl, python3 и .NET 10 SDK.
probe-local.sh — это просто удобная обёртка. Если вы предпочитаете делать это вручную, например, чтобы оставить сервер работающим на время нескольких запусков зонда, соберите и запустите контейнер самостоятельно, затем нацельте зонд на него. Выполняйте эти команды из корня репозитория, так как это контекст сборки Docker:
docker build -t probe-actix -f src/Servers/ActixServer/Dockerfile .
docker run -d --name probe-target --network host probe-actix
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 8080
docker rm -f probe-target
Вы также можете направить зонд на любой уже работающий HTTP/1.1-сервер:
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 9000
Требуется .NET 10 SDK.
dotnet build Http11Probe.slnx
Рабочий процесс Probe запускается на pull request и workflow_dispatch. Он собирает Docker-образ каждого сервера, тестирует его и публикует сравнительную таблицу в виде комментария к PR.