
Открытая тестовая платформа, которая проверяет HTTP/1.1 серверы на соответствие требованиям RFC 9110/9112, векторы смаглинга и обработку некорректного ввода. Добавьте свой фреймворк, получайте результаты проверки на соответствие автоматически.
Http11Probe — это инструмент проверки соответствия и безопасности для серверов HTTP/1.1. Он отправляет серверу через необработанные TCP-сокеты некорректные, неоднозначные и слишком большие запросы и проверяет, как сервер отвечает на них с точки зрения того, что на самом деле требуют RFC 9110 и RFC 9112. Это те самые неудобные случаи — окончания строк с одиночным LF, устаревшее сворачивание строк, контрабанда запросов CL/TE, трюки с фрагментированием chunked-кодирования, слишком большие заголовки и байты NUL, — где строгий парсер и снисходительный начинают расходиться во мнениях.
Одни и те же 215 тестов выполняются против 42 эталонных серверов, написанных на 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-запросах и workflow_dispatch. Он собирает Docker-образ каждого сервера, проверяет его и публикует таблицу сравнения в виде комментария к PR.