
Uma plataforma de testes aberta que testa servidores HTTP/1.1 conforme os requisitos das RFCs 9110/9112, vetores de smuggling e tratamento de entrada malformada. Adicione seu framework e obtenha resultados de conformidade automaticamente.
O Http11Probe é um testador de conformidade e segurança para servidores HTTP/1.1. Ele envia requisições malformadas, ambíguas e superdimensionadas para um servidor por meio de sockets TCP brutos e verifica como o servidor responde em comparação com o que a RFC 9110 e a RFC 9112 realmente exigem. São aqueles casos complicados, como terminações de linha com apenas LF, dobramento de linha obsoleto, contrabando de requisições CL/TE, truques de enquadramento de chunk, cabeçalhos superdimensionados e bytes NUL, onde um analisador restritivo e um permissivo começam a discordar.
Os mesmos 215 testes são executados em 41 servidores de referência escritos em 12 linguagens, desde Nginx, Apache e Envoy até Kestrel, Gin, Actix e os servidores integrados do Node, Bun e Deno. Cada resultado é pontuado de acordo com a redação MUST/SHOULD/MAY da especificação e marcado como Pass, Fail ou Warn. Um Warn significa apenas que a RFC permite tanto o comportamento restritivo quanto o permissivo, portanto nenhum dos dois está errado.
Encontrará a documentação completa, um glossário por teste com citações às RFCs e a matriz de resultados ao vivo para cada servidor em http-probe.com.
O probe é independente do alvo. Ele testa qualquer servidor HTTP/1.1 que já esteja ouvindo em --host:--port, e não há uma flag para escolher um framework. Inicie o servidor primeiro (ou deixe o probe-local.sh iniciar um para você) e então aponte o probe para ele.
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 8080
| Bandeira | Descrição | Padrão |
|---|---|---|
--host | Nome do host ou endereço IP alvo | localhost |
--port | Número da porta alvo | 8080 |
--category | Executar apenas testes nesta categoria (Compliance, Smuggling, MalformedInput, Normalization, Cookies, Capabilities) | todos |
--test | Executar apenas IDs de teste específicos (não sensível a maiúsc./minúsc., repetível) | todos |
--timeout | Tempo limite de conexão e leitura em segundos por teste | 5 |
--output | Escrever resultados JSON em um arquivo | nenhum |
--verbose, -v | Imprimir a resposta bruta do servidor para cada teste | desligado |
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 8080 --output results.json
Executar testes específicos:
dotnet run --project src/Http11Probe.Cli -- --test SMUG-CL-TE-BOTH --test SMUG-DUPLICATE-CL
Os resultados são transmitidos para o console à medida que cada teste é concluído, com um resumo no final:
Score: 97/97 19 warnings (146 tests, 35.5s)
O probe apenas envia requisições, ele não inicia servidores. Para testar um dos servidores inclusos em src/Servers/, use scripts/probe-local.sh. Ele faz o mesmo que o pipeline de CI: constrói a imagem Docker do servidor, executa-a em --network host, aguarda sua inicialização, testa-a e depois a desmonta.
# Testar um servidor pelo nome do diretório em src/Servers/, ex.: ActixServer
scripts/probe-local.sh --server ActixServer
# Testar todos os servidores inclusos
scripts/probe-local.sh --all
O valor de --server é o nome do diretório (ActixServer), não o nome de exibição (Actix). Se o seu daemon Docker precisar de root, adicione --docker-sudo para não ter que executar o script inteiro com sudo:
scripts/probe-local.sh --server ActixServer --docker-sudo
| Bandeira | Descrição |
|---|---|
--server <Dir> | Testar um único servidor pelo nome do diretório em src/Servers/ (ex.: NginxServer) |
--all | Testar todos os servidores em src/Servers/*/probe.json |
--port <Port> | Porta alvo (padrão: 8080) |
--skip-build | Pular dotnet build (assume que uma build Release já existe) |
--verbose | Passar --verbose para a CLI |
--docker-sudo | Executar comandos Docker via sudo (permite executar o script sem sudo) |
-h, --help | Mostrar ajuda |
Ele escreve probe-<ServerDir>.json (um por servidor), além de probe-data.js e docs/static/probe/data.js para renderização local. Você precisará de jq, docker, curl, python3 e do .NET 10 SDK.
probe-local.sh é apenas um invólucro de conveniência. Se preferir fazer manualmente, por exemplo, para manter um servidor ativo durante várias execuções do probe, construa e execute o contêiner você mesmo e então aponte o probe para ele. Execute a partir da raiz do repositório, pois esse é o contexto de build do 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
Você também pode apontar o probe para qualquer servidor HTTP/1.1 que já esteja em execução:
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 9000
Requer o .NET 10 SDK.
dotnet build Http11Probe.slnx
O Probe workflow é executado em pull requests e workflow_dispatch. Ele constrói a imagem Docker de cada servidor, testa-o e publica uma tabela de comparação como um comentário no PR.