
Una plataforma de pruebas abierta que sondea servidores HTTP/1.1 frente a los requisitos de RFC 9110/9112, vectores de contrabando y manejo de entrada malformada. Agregue su framework, obtenga resultados de cumplimiento automáticamente.
Http11Probe es un comprobador de cumplimiento y seguridad para servidores HTTP/1.1. Envía peticiones malformadas, ambiguas y de gran tamaño a un servidor a través de sockets TCP sin procesar y verifica cómo responde en comparación con lo que realmente exigen los RFC 9110 y RFC 9112. Estos son los casos incómodos como terminaciones de línea LF solitarias, plegado de líneas obsoleto, contrabando de peticiones CL/TE, trucos de encuadre de fragmentos, cabeceras de gran tamaño y bytes NUL, donde un analizador estricto y uno permisivo empiezan a discrepar.
Las mismas 215 pruebas se ejecutan contra 41 servidores de referencia escritos en 12 lenguajes, desde Nginx, Apache y Envoy hasta Kestrel, Gin, Actix y los servidores integrados en Node, Bun y Deno. Cada resultado se puntúa según la redacción DEBE/DEBERÍA/PUEDE de la especificación y se marca como Pass, Fail o Warn. Un Warn simplemente significa que el RFC permite tanto el comportamiento estricto como el permisivo, por lo que ninguno está equivocado.
Encontrarás la documentación completa, un glosario por prueba con citas de los RFC y la matriz de resultados en vivo para cada servidor en http-probe.com.
La sonda no depende del objetivo. Prueba cualquier servidor HTTP/1.1 que ya esté escuchando en --host:--port, y no hay una bandera para seleccionar un framework. Inicia primero el servidor (o deja que probe-local.sh inicie uno por ti) y luego apunta la sonda hacia él.
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 8080
| Bandera | Descripción | Predeterminado |
|---|---|---|
--host | Nombre de host o dirección IP de destino | localhost |
--port | Número de puerto de destino | 8080 |
--category | Ejecutar solo pruebas en esta categoría (Compliance, Smuggling, MalformedInput, Normalization, Cookies, Capabilities) | all |
--test | Ejecutar solo identificadores de prueba específicos, sin distinción de mayúsculas/minúsculas (repetible) | all |
--timeout | Tiempo de espera de conexión y lectura en segundos por prueba | 5 |
--output | Escribir resultados JSON en un archivo | none |
--verbose, -v | Imprimir la respuesta sin procesar del servidor para cada prueba | off |
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 8080 --output results.json
Ejecutar pruebas específicas:
dotnet run --project src/Http11Probe.Cli -- --test SMUG-CL-TE-BOTH --test SMUG-DUPLICATE-CL
Los resultados se muestran en la consola a medida que cada prueba se completa, con un resumen al final:
Score: 97/97 19 warnings (146 tests, 35.5s)
La sonda solo envía peticiones, no inicia servidores. Para sondear uno de los servidores incluidos en src/Servers/, usa scripts/probe-local.sh. Hace lo mismo que el pipeline de CI: construye la imagen Docker del servidor, la ejecuta en --network host, espera a que se inicie, la sondea y luego la detiene.
# Sondear un servidor por su nombre de directorio en src/Servers/, ej. ActixServer
scripts/probe-local.sh --server ActixServer
# Sondear todos los servidores incluidos
scripts/probe-local.sh --all
El valor de --server es el nombre del directorio (ActixServer), no el nombre mostrado (Actix). Si tu daemon de Docker necesita root, añade --docker-sudo para no tener que ejecutar todo el script con sudo:
scripts/probe-local.sh --server ActixServer --docker-sudo
| Bandera | Descripción |
|---|---|
--server <Dir> | Sondear un solo servidor por su nombre de directorio en src/Servers/ (ej. NginxServer) |
--all | Sondear todos los servidores en src/Servers/*/probe.json |
--port <Port> | Puerto de destino (predeterminado: 8080) |
--skip-build | Omitir dotnet build (asume que ya existe una compilación Release) |
--verbose | Pasar --verbose a la CLI |
--docker-sudo | Ejecutar comandos Docker mediante sudo (permite ejecutar el script sin sudo) |
-h, --help | Mostrar ayuda |
Escribe probe-<ServerDir>.json (uno por servidor), además de probe-data.js y docs/static/probe/data.js para la representación local. Necesitarás jq, docker, curl, python3 y el SDK de .NET 10.
probe-local.sh es solo un envoltorio de conveniencia. Si prefieres hacerlo manualmente, por ejemplo para mantener un servidor activo durante varias ejecuciones de la sonda, construye y ejecuta el contenedor tú mismo, y luego apunta la sonda hacia él. Ejecuta estos comandos desde la raíz del repositorio, ya que ese es el contexto de construcción de 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
También puedes apuntar la sonda a cualquier servidor HTTP/1.1 que ya tengas en ejecución:
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 9000
Requiere el SDK de .NET 10.
dotnet build Http11Probe.slnx
El flujo de trabajo Probe se ejecuta en pull requests y workflow_dispatch. Construye la imagen Docker de cada servidor, lo sondea y publica una tabla de comparación como comentario en el PR.