Skip to content

Commit ff04ed2

Browse files
authored
Merge pull request #28 from MDA2AV/feature/server-config-display
Make server configs acccessible in the website
2 parents 4cd0d7c + 53be743 commit ff04ed2

49 files changed

Lines changed: 2191 additions & 2150 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
##
88
## Get latest from https://github.com/github/gitignore/blob/main/Dotnet.gitignore
99

10-
# Rider
10+
# Rider / VS
1111
.idea/
12+
*.DotSettings.user
1213

1314
# Build results
1415
[Dd]ebug/
@@ -63,5 +64,12 @@ docs/resources/
6364
# Probe data (generated by CI, pushed to latest-results branch)
6465
docs/static/probe/data.js
6566

67+
# Python
68+
__pycache__/
69+
6670
# Node
6771
node_modules/
72+
package-lock.json
73+
74+
# Probe results (local testing)
75+
probe-*.json

CHANGELOG.md

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# Changelog
2+
3+
All notable changes to Http11Probe are documented in this file.
4+
5+
## [Unreleased]
6+
7+
### Added
8+
- **Server configuration pages** — per-server docs pages showing Dockerfile, source code, and config files for all 36 tested servers (`docs/content/servers/`)
9+
- **Clickable server names** — server names in the probe results table and summary bar chart now link to their configuration page
10+
11+
## [2026-02-12]
12+
13+
### Added
14+
- **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)
15+
- Repository cleanup — removed clutter files (probe-glyph.json, pycache, package-lock.json, DotSettings.user)
16+
17+
### Fixed
18+
- BARE-LF tests (RFC 9112 §2.2) adjusted to warn on 2xx instead of fail, matching RFC SHOULD-level requirement (#21)
19+
20+
### Removed
21+
- Proxy compliance tests removed from the suite (#20)
22+
23+
## [2026-02-11]
24+
25+
### Added
26+
- POST endpoint for Kestrel (ASP.NET Minimal) server (#13)
27+
- POST endpoint for Quarkus server (#14)
28+
- POST endpoint for Spring Boot server (#16)
29+
- POST endpoint for Express server (#17)
30+
31+
### Fixed
32+
- H2O server now allows POST commands (#19)
33+
- Flask server routing and default port (#11)
34+
- SimpleW server POST handling and version update (#5)
35+
36+
## [2026-02-09]
37+
38+
### Added
39+
- SimpleW server contributed by stratdev3 (#2)
40+
41+
### Fixed
42+
- Glyph server — reset request state on each new connection (#3)
43+
- In-development frameworks now filtered from results (#4)
44+
- SimpleW removed from blacklisted servers
45+
46+
## [2026-02-08]
47+
48+
### Added
49+
- **30 new tests** — body/content handling, chunked TE attack vectors, and additional compliance/smuggling tests (46 → 80 → 110+)
50+
- **7 new servers** — Actix, Ntex, Bun, H2O, NetCoreServer, Sisk, Watson
51+
- **6 more servers** — GenHTTP, SimpleW, EmbedIO, Puma, PHP, Deno, and others (total: 36)
52+
- **Deep analysis docs** — verified RFC evidence and ABNF grammar added to all glossary pages
53+
- **Exact HTTP request code blocks** in all glossary pages
54+
- **Category filter** — filter probe results by Compliance, Smuggling, or Malformed Input
55+
- **Language filter** — filter servers by programming language
56+
- **Sub-tables** — result tables split into logical groups within each category
57+
- **Unscored tests** — separate bucket for RFC-compliant reference tests, shown with reduced opacity and asterisk
58+
- **CLI improvements**`--test` filter, `--help`, docs links in output, selected test display
59+
- **Summary bar chart** — ranked bars replacing summary badges, with pass/warn/fail/unscored segments
60+
- **Scrollbar styling** — themed scrollbars for probe result tables
61+
- **Custom favicon** — shield icon for browser tab
62+
- **Docs logo** — minimal shield outline
63+
64+
### Fixed
65+
- Summary fail count derivation so pass + warn + fail = total
66+
- Unscored double-counting in summary statistics
67+
- Sort order: rank by scored pass + scored warn only
68+
- Puma Dockerfile: install build-essential for nio4r native extension
69+
- Deno Dockerfile: use `latest` tag instead of nonexistent `:2`
70+
- FRAGMENT-IN-TARGET re-scored as strict (implicit grammar prohibition)
71+
- Nancy and Nginx failing to start in CI
72+
- All servers bound to `0.0.0.0` for Docker reachability
73+
74+
### Removed
75+
- Redundant SMUG-HEADER-INJECTION test (covered by other smuggling tests)
76+
- Nancy server removed from probe (no probe.json)
77+
78+
## [2026-02-07]
79+
80+
### Added
81+
- **Initial release** — extracted from Glyph11 into standalone Http11Probe repository
82+
- 12 standalone test servers dockerized with Docker Compose
83+
- Sequential probe workflow — one server at a time on port 8080
84+
- CI probe workflow (`.github/workflows/probe.yml`) with STRICT expectations dictionary
85+
- Hugo + Hextra documentation site with glossary, per-test docs, and probe results pages
86+
- Separate pages for Compliance, Smuggling, Malformed Input categories
87+
- Landing page with platform framing and contributor onboarding
88+
- "Add a Framework" documentation page
89+
90+
### Fixed
91+
- Docker image tags lowercased as required
92+
- Git worktree/orphan branch creation for latest-results
93+
- GlyphServer: replaced manual buffer with PipeReader, fixed closing without response on oversized requests
94+
- Pingora build: added cmake and g++ to build stage

Http11Probe.sln.DotSettings.user

Lines changed: 0 additions & 3 deletions
This file was deleted.

docs/content/compliance/_index.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ These tests validate that HTTP/1.1 servers correctly implement the protocol requ
1010

1111
Each test sends a request that violates a specific **MUST** or **MUST NOT** requirement from the RFCs. A compliant server should reject these with a `400 Bad Request` (or close the connection). Accepting the request silently means the server is non-compliant and potentially vulnerable to downstream attacks.
1212

13+
{{< callout type="info" >}}
14+
Click a **server name** to view its Dockerfile and source code. Click a **result cell** to see the full HTTP request and response.
15+
{{< /callout >}}
16+
1317
<div id="lang-filter"></div>
1418
<div id="table-compliance"><p><em>Loading...</em></p></div>
1519

docs/content/malformed-input/_index.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ These tests send pathological, oversized, or completely invalid payloads to veri
1010

1111
A well-implemented server should respond with `400 Bad Request`, `414 URI Too Long`, or `431 Request Header Fields Too Large` depending on the violation, or simply close the connection.
1212

13+
{{< callout type="info" >}}
14+
Click a **server name** to view its Dockerfile and source code. Click a **result cell** to see the full HTTP request and response.
15+
{{< /callout >}}
16+
1317
<div id="lang-filter"></div>
1418
<div id="table-malformed"><p><em>Loading...</em></p></div>
1519

docs/content/probe-results/_index.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ HTTP/1.1 compliance comparison across frameworks. Each test sends a specific mal
1212

1313
## Summary
1414

15+
{{< callout type="info" >}}
16+
These results are from CI runs (`ubuntu-latest`). Click a **server name** to view its Dockerfile and source code. Click on the **Compliance**, **Smuggling**, or **Malformed Input** tabs above for detailed results per category, where you can click any **result cell** to see the full HTTP request and response.
17+
{{< /callout >}}
18+
1519
<div id="lang-filter" style="margin-bottom:6px;"></div>
1620
<div id="cat-filter" style="margin-bottom:16px;"></div>
1721
<div id="probe-summary"><p><em>Loading probe data...</em></p></div>
@@ -24,10 +28,6 @@ HTTP/1.1 compliance comparison across frameworks. Each test sends a specific mal
2428

2529
**Unscored** — tests marked with `*` in the detail tables. These cover RFC language that uses "MAY" or permits multiple valid behaviors, so there is no single correct answer to score against. They are still run and displayed for visibility, but do not count toward the pass/fail score.
2630

27-
{{< callout type="info" >}}
28-
These results are from CI runs (`ubuntu-latest`). Click on the **Compliance**, **Smuggling**, or **Malformed Input** tabs above for detailed results per category.
29-
{{< /callout >}}
30-
3131
<script src="/Http11Probe/probe/data.js"></script>
3232
<script src="/Http11Probe/probe/render.js"></script>
3333
<script>

docs/content/servers/_index.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
title: "Servers"
3+
toc: false
4+
breadcrumbs: false
5+
sidebar:
6+
open: false
7+
---
8+
9+
Configuration and source code for each server tested by Http11Probe.

docs/content/servers/actix.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
---
2+
title: "Actix"
3+
toc: false
4+
breadcrumbs: false
5+
---
6+
7+
**Language:** Rust · [View source on GitHub](https://github.com/MDA2AV/Http11Probe/tree/main/src/Servers/ActixServer)
8+
9+
## Dockerfile
10+
11+
```dockerfile
12+
FROM rust:1-slim AS build
13+
WORKDIR /src
14+
15+
# Cache dependencies with dummy main
16+
COPY src/Servers/ActixServer/Cargo.toml .
17+
RUN mkdir src && echo "fn main() {}" > src/main.rs && cargo build --release && rm -rf src target/release/.fingerprint/actix-server-*
18+
19+
COPY src/Servers/ActixServer/src/ src/
20+
RUN cargo build --release
21+
22+
FROM debian:bookworm-slim
23+
COPY --from=build /src/target/release/actix-server /usr/local/bin/
24+
ENTRYPOINT ["actix-server", "8080"]
25+
```
26+
27+
## Source — `src/main.rs`
28+
29+
```rust
30+
use actix_web::{web, App, HttpServer, HttpRequest, HttpResponse};
31+
32+
async fn handler(req: HttpRequest, body: web::Bytes) -> HttpResponse {
33+
if req.method() == actix_web::http::Method::POST {
34+
HttpResponse::Ok()
35+
.content_type("text/plain")
36+
.body(body)
37+
} else {
38+
HttpResponse::Ok()
39+
.content_type("text/plain")
40+
.body("OK")
41+
}
42+
}
43+
44+
#[actix_web::main]
45+
async fn main() -> std::io::Result<()> {
46+
let port: u16 = std::env::args()
47+
.nth(1)
48+
.and_then(|s| s.parse().ok())
49+
.unwrap_or(8080);
50+
51+
HttpServer::new(|| {
52+
App::new().default_service(web::to(handler))
53+
})
54+
.bind(("0.0.0.0", port))?
55+
.run()
56+
.await
57+
}
58+
```

docs/content/servers/apache.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
---
2+
title: "Apache"
3+
toc: false
4+
breadcrumbs: false
5+
---
6+
7+
**Language:** C · [View source on GitHub](https://github.com/MDA2AV/Http11Probe/tree/main/src/Servers/ApacheServer)
8+
9+
## Dockerfile
10+
11+
```dockerfile
12+
FROM httpd:2.4
13+
14+
COPY src/Servers/ApacheServer/httpd-probe.conf /usr/local/apache2/conf/httpd.conf
15+
RUN echo "OK" > /usr/local/apache2/htdocs/index.html
16+
```
17+
18+
## Source — `httpd-probe.conf`
19+
20+
```apacheconf
21+
ServerRoot "/usr/local/apache2"
22+
Listen 8080
23+
24+
LoadModule mpm_event_module modules/mod_mpm_event.so
25+
LoadModule dir_module modules/mod_dir.so
26+
LoadModule unixd_module modules/mod_unixd.so
27+
LoadModule authz_core_module modules/mod_authz_core.so
28+
29+
ErrorLog /proc/self/fd/2
30+
LogLevel warn
31+
32+
DocumentRoot "/usr/local/apache2/htdocs"
33+
34+
<Directory "/usr/local/apache2/htdocs">
35+
Require all granted
36+
</Directory>
37+
```
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
---
2+
title: "Kestrel"
3+
toc: false
4+
breadcrumbs: false
5+
---
6+
7+
**Language:** C# · [View source on GitHub](https://github.com/MDA2AV/Http11Probe/tree/main/src/Servers/AspNetMinimal)
8+
9+
## Dockerfile
10+
11+
```dockerfile
12+
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
13+
WORKDIR /src
14+
COPY Directory.Build.props .
15+
COPY src/Servers/AspNetMinimal/ src/Servers/AspNetMinimal/
16+
RUN dotnet restore src/Servers/AspNetMinimal/AspNetMinimal.csproj
17+
RUN dotnet publish src/Servers/AspNetMinimal/AspNetMinimal.csproj -c Release -o /app --no-restore
18+
19+
FROM mcr.microsoft.com/dotnet/aspnet:10.0
20+
WORKDIR /app
21+
COPY --from=build /app .
22+
ENTRYPOINT ["dotnet", "AspNetMinimal.dll"]
23+
```
24+
25+
## Source — `Program.cs`
26+
27+
```csharp
28+
var builder = WebApplication.CreateBuilder(args);
29+
30+
builder.WebHost.UseUrls("http://+:8080");
31+
32+
var app = builder.Build();
33+
34+
app.MapGet("/", () => "OK");
35+
36+
app.MapPost("/", async (HttpContext ctx) =>
37+
{
38+
using var reader = new StreamReader(ctx.Request.Body);
39+
var body = await reader.ReadToEndAsync();
40+
return Results.Text(body);
41+
});
42+
43+
app.Run();
44+
```

0 commit comments

Comments
 (0)