All notable changes to Http11Probe are documented in this file.
- Watson server — removed from the test suite
- Baseline test gate — probe workflow now fails when a server can't pass
COMP-BASELINEorCOMP-POST-CL-BODY, blocking merge; PR comment shows prominent pass/fail status and is posted even on failure (#98) - 4 caching tests —
CAP-IMS-FUTURE(If-Modified-Since with future date),CAP-IMS-INVALID(invalid IMS value),CAP-INM-UNQUOTED(unquoted ETag in If-None-Match),CAP-ETAG-WEAK(weak ETag validation) (#94) - Sequence tests — new multi-step test infrastructure (
SequenceTestCase,SequenceStep,SequenceSendPart) for desync and smuggling detection with timed partial sends and behavioral analysis (#74) - 26 new smuggling tests — multi-step sequence tests for CL.TE, TE.CL, and desync detection:
SMUG-CLTE-SMUGGLED-GET— CL.TE with embedded GET; multiple responses indicate boundary confusionSMUG-CLTE-SMUGGLED-HEAD— CL.TE with embedded HEADSMUG-CLTE-SMUGGLED-GET-CL-PLUS— CL.TE smuggled GET with malformed CL (+N)SMUG-CLTE-SMUGGLED-GET-CL-NON-NUMERIC— CL.TE smuggled GET with non-numeric CLSMUG-CLTE-SMUGGLED-GET-TE-OBS-FOLD— CL.TE smuggled GET with obs-folded TESMUG-CLTE-SMUGGLED-GET-TE-TRAILING-SPACE— CL.TE smuggled GET with TE trailing spaceSMUG-CLTE-SMUGGLED-GET-TE-LEADING-COMMA— CL.TE smuggled GET with TE leading commaSMUG-CLTE-SMUGGLED-GET-TE-CASE-MISMATCH— CL.TE smuggled GET with TE case mismatchSMUG-TE-DUPLICATE-HEADERS-SMUGGLED-GET— duplicate TE headers with embedded GETSMUG-TECL-SMUGGLED-GET— TE.CL with embedded GET (chunk-size prefix trick)SMUG-DUPLICATE-CL-SMUGGLED-GET— duplicate Content-Length with embedded GETSMUG-GET-CL-PREFIX-DESYNC— GET with CL prefix desyncSMUG-CLTE-DESYNC— CL.TE desync with pause-based detectionSMUG-TECL-DESYNC— TE.CL desync with pause-based detectionSMUG-CLTE-CONN-CLOSE— CL.TE desync with Connection: closeSMUG-TECL-CONN-CLOSE— TE.CL desync with Connection: closeSMUG-PIPELINE-SAFE— safe pipeline baseline (no smuggling)SMUG-CL0-BODY-POISON— CL:0 body poison follow-up checkSMUG-GET-CL-BODY-DESYNC— GET with CL body desyncSMUG-OPTIONS-CL-BODY-DESYNC— OPTIONS with CL body desyncSMUG-EXPECT-100-CL-DESYNC— Expect: 100-continue CL desyncSMUG-OPTIONS-TE-OBS-FOLD— OPTIONS with obs-fold TE follow-up checkSMUG-CHUNK-INVALID-SIZE-DESYNC— invalid chunk size + poison follow-upSMUG-CHUNK-EXT-INVALID-TOKEN— invalid token in chunk extension nameSMUG-CHUNK-SIZE-PLUS— chunk size with leading plus signSMUG-CHUNK-SIZE-TRAILING-OWS— chunk size with trailing whitespace
- 11 new compliance tests:
COMP-RANGE-POST— Range header on POST should be ignored (RFC 9110 §14.2)COMP-UPGRADE-HTTP10— Upgrade header in HTTP/1.0 requestCOMP-DATE-FORMAT— Date header format validation (RFC 9110 §5.6.7)COMP-VERSION-CASE— HTTP version case sensitivity (RFC 9112 §2.6)COMP-LONG-URL-OK— long URL within valid range should be acceptedCOMP-SPACE-IN-TARGET— space in request target should be rejectedCOMP-DUPLICATE-CT— duplicate Content-Type headersCOMP-TRACE-SENSITIVE— TRACE method security sensitivity (RFC 9110 §9.3.8)COMP-RANGE-INVALID— invalid Range header formatCOMP-ACCEPT-NONSENSE— nonsensical Accept header valueCOMP-POST-UNSUPPORTED-CT— POST with unsupported Content-Type
- FastEndpoints framework — new test server added to the probe suite (#70)
- Local probe script —
scripts/probe-local.shfor running probes against local servers - Sequence tests UI — probe results page displays sequence test steps with per-step request/response details
- Transposed result tables — rows are now test IDs and columns are servers (previously the reverse), making tall tables with fewer columns (#97)
- SMUG-CLTE-PIPELINE and SMUG-TECL-PIPELINE — re-evaluated scoring and validation logic
- GenHTTP server — clean-up and simplification (contributed by Andreas Nägeli)
- RFC Requirement Dashboard — updated with all 37 new tests and counts
- Traefik server — fixed POST / to echo request body (contributed by SAILESH4406, #79)
- Sequence test UI rendering — fixed display of multi-step test results on probe results page
- Second read from wire — improved response capture with additional socket read for slow/partial responses (#71)
- PR comment score — fixed score calculation in probe workflow CI comments
- NGINX server — fixed implementation (#63)
- RFC Level indicator row — result tables now show a translucent capsule (MUST/SHOULD/MAY/N/A) for each test, indicating the RFC 2119 requirement level
- Method indicator row — result tables show the HTTP method (GET, POST, etc.) for each test in an outlined monospace badge style
- Method filter — filter result tables by HTTP method (GET, POST, HEAD, etc.) on all category pages
- RFC Level filter — filter result tables by RFC requirement level (MUST, SHOULD, MAY, N/A) on all category pages
- Method & RFC Level in popup — server detail modal now includes Method and RFC Level columns alongside Test, Expected, Got, and Description
RfcLevelenum —Must,Should,May,OughtTo,NotApplicableclassification for every test case- RFC Level annotations — all tests across Compliance, Smuggling, MalformedInput, and Normalization suites annotated with their RFC 2119 requirement level
- Verbose Probe workflow — new
probe-verbose.ymlGitHub Action for manual single-server probing with--verboseoutput, triggered viaworkflow_dispatchwith a server name input (#60) - Giscus comments — added comment system to website documentation pages
- AI Contribution guide —
AGENTS.mdfor AI-agent contributions andadd-with-ai-agentdocs page - RFC Requirement Dashboard page — comprehensive per-test RFC requirement tracking with counts and cross-references
- 9 new RFC 9110 compliance tests sourced from mohammed90/http-compliance-testing:
COMP-HEAD-NO-BODY— HEAD response must not contain a message body (RFC 9110 §9.3.2, MUST)COMP-UNKNOWN-METHOD— unrecognized method should be rejected with 501/405 (RFC 9110 §9.1, SHOULD)COMP-405-ALLOW— 405 response must include Allow header (RFC 9110 §15.5.6, MUST)COMP-DATE-HEADER— origin server must include Date header in responses (RFC 9110 §6.6.1, MUST)COMP-NO-1XX-HTTP10— server must not send 1xx to HTTP/1.0 client (RFC 9110 §15.2, MUST NOT)COMP-NO-CL-IN-204— Content-Length forbidden in 204 responses (RFC 9110 §8.6, MUST NOT)SMUG-CL-COMMA-TRIPLE— three comma-separated identical CL values (RFC 9110 §8.6, unscored)COMP-OPTIONS-ALLOW— OPTIONS response should include Allow header (RFC 9110 §9.3.7, SHOULD)COMP-CONTENT-TYPE— response with content should include Content-Type (RFC 9110 §8.3, SHOULD)
- AGENTS.md — added Step 5 (RFC Requirement Dashboard) to the "Add a new test" task; added Step 5 (server documentation page) to the "Add a framework" task
- RFC Requirement Dashboard — updated with all 9 new tests, counts, and cross-references
- Landing page cards — removed hardcoded test count from RFC Requirement Dashboard subtitle
- Score calculation — warnings now included in the overall score (#66)
- Caddy server — fixed POST body echo using Caddy Parrot pattern; updated Caddyfile, Dockerfile, and docs page
- Lighttpd server — fixed POST body echo implementation (#57)
- HAProxy server — fixed POST / endpoint (#64)
- Echo validation — empty body now correctly returns Fail; body mismatch returns Fail; chunked transfer encoding properly decoded before comparison (#61)
- Validator ordering — fixed 8 tests where connection-state check ran before response-status check, preventing false passes when server returned 2xx then closed (COMP-POST-CL-UNDERSEND, RFC9112-2.3-HTTP09-REQUEST, MAL-BINARY-GARBAGE, MAL-INCOMPLETE-REQUEST, MAL-EMPTY-REQUEST, MAL-WHITESPACE-ONLY-LINE, MAL-H2-PREFACE, MAL-POST-CL-HUGE-NO-BODY)
- COMP-CHUNKED-NO-FINAL validator — fixed same ordering bug where connection close was accepted even when server returned 2xx
- Method extraction — handles leading CRLF in raw requests and tab-delimited request lines; non-HTTP pseudo-methods (PRI) shown as '?'
- Category-scoped filters — Method and RFC Level filters now only show options relevant to the current category page
- Server configuration pages — per-server docs pages showing Dockerfile, source code, and config files for all 36 tested servers (
docs/content/servers/) (#28) - Clickable server names — server names in the probe results table and summary bar chart now link to their configuration page
- Sticky first column — server name column stays pinned to the left edge while scrolling horizontally through result tables
- Collapsible sub-groups — group headers in result tables are now clickable to collapse/expand, with a chevron indicator and a "Collapse All / Expand All" toggle button
- Row-click detail popup — clicking a server row opens a modal showing that server's results for the current table in a vertical layout (Test, Expected, Got, Description) with section and table name in the header
- Truncation notice — tooltip and modal now show a
[Truncated]notice at the top when raw request/response data exceeds the 8,192-byte display limit - Header normalization section — new test category for header normalization tests (#32)
- "Add a Framework" section improvements — expanded documentation for adding new server frameworks (#42)
- Scrollable tooltips — hover tooltips are now interactive and scrollable for large payloads (removed
pointer-events:none, increasedmax-heightto60vh) - Larger click modal — expanded from
max-width:700pxto90vwandmax-heightfrom80vhto85vhto better accommodate large request/response data - Raw request capture now includes truncation metadata when payload exceeds 8,192 bytes
- Raw response capture now includes truncation metadata when response exceeds 8,192 bytes
- Test re-evaluation — reviewed and re-scored multiple tests for RFC alignment (#29)
- Kestrel server — fixed HEAD and OPTIONS headers allowed (#39)
- Node.js server — fixed errors in Express server (#37)
- CLI and PR scores — fixed score calculation in CLI output and PR comments
- GenHTTP server re-enabled in probe suite
- Request/response detail tooltips — hover over a result pill to see the raw response; click to open a modal with both the raw request and response (#27)
- Repository cleanup — removed clutter files (probe-glyph.json, pycache, package-lock.json, DotSettings.user)
- BARE-LF tests (RFC 9112 §2.2) adjusted to warn on 2xx instead of fail, matching RFC SHOULD-level requirement (#21)
- Proxy compliance tests removed from the suite (#20)
- POST endpoint for Kestrel (ASP.NET Minimal) server (#13)
- POST endpoint for Quarkus server (#14)
- POST endpoint for Spring Boot server (#16)
- POST endpoint for Express server (#17)
- H2O server now allows POST commands (#19)
- Flask server routing and default port (#11)
- SimpleW server POST handling and version update (#5)
- SimpleW server contributed by stratdev3 (#2)
- Glyph server — reset request state on each new connection (#3)
- In-development frameworks now filtered from results (#4)
- SimpleW removed from blacklisted servers
- 30 new tests — body/content handling, chunked TE attack vectors, and additional compliance/smuggling tests (46 → 80 → 110+)
- 7 new servers — Actix, Ntex, Bun, H2O, NetCoreServer, Sisk, Watson
- 6 more servers — GenHTTP, SimpleW, EmbedIO, Puma, PHP, Deno, and others (total: 36)
- Deep analysis docs — verified RFC evidence and ABNF grammar added to all glossary pages
- Exact HTTP request code blocks in all glossary pages
- Category filter — filter probe results by Compliance, Smuggling, or Malformed Input
- Language filter — filter servers by programming language
- Sub-tables — result tables split into logical groups within each category
- Unscored tests — separate bucket for RFC-compliant reference tests, shown with reduced opacity and asterisk
- CLI improvements —
--testfilter,--help, docs links in output, selected test display - Summary bar chart — ranked bars replacing summary badges, with pass/warn/fail/unscored segments
- Scrollbar styling — themed scrollbars for probe result tables
- Custom favicon — shield icon for browser tab
- Docs logo — minimal shield outline
- Summary fail count derivation so pass + warn + fail = total
- Unscored double-counting in summary statistics
- Sort order: rank by scored pass + scored warn only
- Puma Dockerfile: install build-essential for nio4r native extension
- Deno Dockerfile: use
latesttag instead of nonexistent:2 - FRAGMENT-IN-TARGET re-scored as strict (implicit grammar prohibition)
- Nancy and Nginx failing to start in CI
- All servers bound to
0.0.0.0for Docker reachability
- Redundant SMUG-HEADER-INJECTION test (covered by other smuggling tests)
- Nancy server removed from probe (no probe.json)
- Initial release — extracted from Glyph11 into standalone Http11Probe repository
- 12 standalone test servers dockerized with Docker Compose
- Sequential probe workflow — one server at a time on port 8080
- CI probe workflow (
.github/workflows/probe.yml) with STRICT expectations dictionary - Hugo + Hextra documentation site with glossary, per-test docs, and probe results pages
- Separate pages for Compliance, Smuggling, Malformed Input categories
- Landing page with platform framing and contributor onboarding
- "Add a Framework" documentation page
- Docker image tags lowercased as required
- Git worktree/orphan branch creation for latest-results
- GlyphServer: replaced manual buffer with PipeReader, fixed closing without response on oversized requests
- Pingora build: added cmake and g++ to build stage