Skip to content

Commit bac1f7a

Browse files
MDA2AVclaude
andcommitted
Fix summary fail count, sync 37 missing tests in tables, mark unscored in CLI
- render.js: use s.failed from data instead of wrong total-passed-warnings formula - render.js: add dynamic "Other" fallback in renderSubTables for ungrouped tests - compliance/smuggling/malformed _index.md: add all missing test IDs to groups - render.js: add 31 missing TEST_URLS entries, remove phantom SMUG-HEADER-INJECTION - ConsoleReporter: mark unscored tests with * suffix (PASS*, WARN*) - TestRunReport: add UnscoredCount, show in summary so numbers add up Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 28be8e9 commit bac1f7a

6 files changed

Lines changed: 86 additions & 16 deletions

File tree

docs/content/compliance/_index.md

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,25 +28,32 @@ Each test sends a request that violates a specific **MUST** or **MUST NOT** requ
2828
'RFC9112-3-MULTI-SP-REQUEST-LINE','RFC9112-3-MISSING-TARGET',
2929
'RFC9112-3.2-FRAGMENT-IN-TARGET','RFC9112-2.3-INVALID-VERSION',
3030
'RFC9112-2.3-HTTP09-REQUEST','COMP-ASTERISK-WITH-GET','COMP-OPTIONS-STAR',
31-
'COMP-CONNECT-EMPTY-PORT','COMP-ABSOLUTE-FORM','COMP-METHOD-CASE',
31+
'COMP-CONNECT-EMPTY-PORT','COMP-CONNECT-ORIGIN-FORM','COMP-ABSOLUTE-FORM',
32+
'COMP-METHOD-CASE','COMP-REQUEST-LINE-TAB',
33+
'COMP-VERSION-MISSING-MINOR','COMP-VERSION-LEADING-ZEROS',
34+
'COMP-VERSION-WHITESPACE','COMP-HTTP12-VERSION',
3235
'RFC9112-5.1-OBS-FOLD','RFC9110-5.6.2-SP-BEFORE-COLON',
3336
'RFC9112-5-EMPTY-HEADER-NAME','RFC9112-5-INVALID-HEADER-NAME',
3437
'RFC9112-5-HEADER-NO-COLON',
3538
'RFC9112-7.1-MISSING-HOST','RFC9110-5.4-DUPLICATE-HOST',
3639
'COMP-DUPLICATE-HOST-SAME','COMP-HOST-WITH-USERINFO','COMP-HOST-WITH-PATH',
40+
'COMP-HOST-EMPTY-VALUE',
3741
'RFC9112-6.1-CL-NON-NUMERIC','RFC9112-6.1-CL-PLUS-SIGN'
3842
]},
3943
{ key: 'body', label: 'Body Handling', testIds: [
4044
'COMP-POST-CL-BODY','COMP-POST-CL-ZERO','COMP-POST-NO-CL-NO-TE',
4145
'COMP-POST-CL-UNDERSEND','COMP-CHUNKED-BODY','COMP-CHUNKED-MULTI',
4246
'COMP-CHUNKED-EMPTY','COMP-CHUNKED-NO-FINAL',
43-
'COMP-GET-WITH-CL-BODY','COMP-CHUNKED-EXTENSION'
47+
'COMP-GET-WITH-CL-BODY','COMP-CHUNKED-EXTENSION',
48+
'COMP-CHUNKED-TRAILER-VALID','COMP-CHUNKED-HEX-UPPERCASE'
4449
]},
4550
{ key: 'methods-upgrade', label: 'Methods & Upgrade', testIds: [
4651
'COMP-METHOD-CONNECT','COMP-METHOD-CONNECT-NO-PORT',
4752
'COMP-UNKNOWN-TE-501','COMP-EXPECT-UNKNOWN','COMP-METHOD-TRACE',
53+
'COMP-TRACE-WITH-BODY',
4854
'COMP-UPGRADE-POST','COMP-UPGRADE-MISSING-CONN',
49-
'COMP-UPGRADE-UNKNOWN','COMP-UPGRADE-INVALID-VER'
55+
'COMP-UPGRADE-UNKNOWN','COMP-UPGRADE-INVALID-VER',
56+
'COMP-CONNECTION-CLOSE','COMP-HTTP10-DEFAULT-CLOSE','COMP-HTTP10-NO-HOST'
5057
]}
5158
];
5259
function render(data) {

docs/content/malformed-input/_index.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,18 @@ A well-implemented server should respond with `400 Bad Request`, `414 URI Too Lo
2424
var GROUPS = [
2525
{ key: 'oversized', label: 'Oversized & Invalid Bytes', testIds: [
2626
'MAL-LONG-URL','MAL-LONG-HEADER-NAME','MAL-LONG-HEADER-VALUE',
27-
'MAL-LONG-METHOD','MAL-MANY-HEADERS','MAL-CHUNK-EXTENSION-LONG',
27+
'MAL-LONG-METHOD','MAL-MANY-HEADERS','MAL-CHUNK-EXT-64K',
2828
'MAL-NUL-IN-URL','MAL-NUL-IN-HEADER-VALUE','MAL-CONTROL-CHARS-HEADER',
29-
'MAL-NON-ASCII-HEADER-NAME','MAL-NON-ASCII-URL','MAL-BINARY-GARBAGE'
29+
'MAL-NON-ASCII-HEADER-NAME','MAL-NON-ASCII-URL','MAL-BINARY-GARBAGE',
30+
'MAL-POST-CL-HUGE-NO-BODY','MAL-RANGE-OVERLAPPING'
3031
]},
3132
{ key: 'parsing-edge', label: 'Parsing & Edge Cases', testIds: [
3233
'MAL-CL-OVERFLOW','MAL-CL-EMPTY','MAL-CHUNK-SIZE-OVERFLOW',
3334
'MAL-CL-TAB-BEFORE-VALUE',
3435
'MAL-INCOMPLETE-REQUEST','MAL-EMPTY-REQUEST',
35-
'MAL-WHITESPACE-ONLY-LINE','MAL-H2-PREFACE'
36+
'MAL-WHITESPACE-ONLY-LINE','MAL-H2-PREFACE',
37+
'MAL-URL-BACKSLASH','MAL-URL-OVERLONG-UTF8',
38+
'MAL-URL-PERCENT-NULL','MAL-URL-PERCENT-CRLF'
3639
]}
3740
];
3841
function render(data) {

docs/content/smuggling/_index.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,29 @@ Some tests are **unscored** (marked with `*`). These send payloads where the RFC
3232
'SMUG-CL-COMMA-DIFFERENT','SMUG-CL-OCTAL','SMUG-CL-HEX-PREFIX',
3333
'SMUG-CL-INTERNAL-SPACE','SMUG-CL-COMMA-SAME',
3434
'SMUG-CL-TRAILING-SPACE','SMUG-CL-EXTRA-LEADING-SP',
35+
'SMUG-CL-UNDERSCORE','SMUG-CL-NEGATIVE-ZERO','SMUG-CL-DOUBLE-ZERO',
36+
'SMUG-CL-LEADING-ZEROS-OCTAL',
3537
'SMUG-TE-XCHUNKED','SMUG-TE-TRAILING-SPACE','SMUG-TE-SP-BEFORE-COLON',
3638
'SMUG-TE-EMPTY-VALUE','SMUG-TE-LEADING-COMMA','SMUG-TE-DUPLICATE-HEADERS',
3739
'SMUG-TE-NOT-FINAL-CHUNKED','SMUG-TE-IDENTITY',
3840
'SMUG-TE-DOUBLE-CHUNKED','SMUG-TE-CASE-MISMATCH',
41+
'SMUG-TE-OBS-FOLD','SMUG-TE-TRAILING-COMMA','SMUG-TE-TAB-BEFORE-VALUE',
42+
'SMUG-TE-VTAB','SMUG-TE-FORMFEED','SMUG-TE-NULL',
3943
'SMUG-TRANSFER_ENCODING','SMUG-CHUNKED-WITH-PARAMS'
4044
]},
4145
{ key: 'chunk', label: 'Chunk Encoding', testIds: [
4246
'SMUG-CHUNK-BARE-SEMICOLON','SMUG-CHUNK-HEX-PREFIX','SMUG-CHUNK-UNDERSCORE',
4347
'SMUG-CHUNK-LEADING-SP','SMUG-CHUNK-MISSING-TRAILING-CRLF',
4448
'SMUG-CHUNK-EXT-LF','SMUG-CHUNK-SPILL','SMUG-CHUNK-LF-TERM',
45-
'SMUG-CHUNK-EXT-CTRL','SMUG-CHUNK-LF-TRAILER','SMUG-CHUNK-NEGATIVE'
49+
'SMUG-CHUNK-EXT-CTRL','SMUG-CHUNK-EXT-CR','SMUG-CHUNK-LF-TRAILER',
50+
'SMUG-CHUNK-NEGATIVE','SMUG-CHUNK-BARE-CR-TERM'
4651
]},
47-
{ key: 'other', label: 'Headers, Trailers & Methods', testIds: [
48-
'SMUG-BARE-CR-HEADER-VALUE','SMUG-HEADER-INJECTION',
52+
{ key: 'headers-trailers', label: 'Headers, Trailers & Methods', testIds: [
53+
'SMUG-BARE-CR-HEADER-VALUE',
4954
'SMUG-TRAILER-CL','SMUG-TRAILER-TE','SMUG-TRAILER-HOST',
50-
'SMUG-EXPECT-100-CL','SMUG-HEAD-CL-BODY','SMUG-OPTIONS-CL-BODY'
55+
'SMUG-TRAILER-AUTH','SMUG-TRAILER-CONTENT-TYPE',
56+
'SMUG-EXPECT-100-CL','SMUG-HEAD-CL-BODY','SMUG-OPTIONS-CL-BODY',
57+
'SMUG-ABSOLUTE-URI-HOST-MISMATCH','SMUG-MULTIPLE-HOST-COMMA'
5158
]}
5259
];
5360
function render(data) {

docs/static/probe/render.js

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,6 @@ window.ProbeRender = (function () {
138138
'SMUG-CLTE-PIPELINE': '/Http11Probe/docs/smuggling/clte-pipeline/',
139139
'SMUG-EXPECT-100-CL': '/Http11Probe/docs/smuggling/expect-100-cl/',
140140
'SMUG-HEAD-CL-BODY': '/Http11Probe/docs/smuggling/head-cl-body/',
141-
'SMUG-HEADER-INJECTION': '/Http11Probe/docs/smuggling/header-injection/',
142141
'SMUG-OPTIONS-CL-BODY': '/Http11Probe/docs/smuggling/options-cl-body/',
143142
'SMUG-TE-CASE-MISMATCH': '/Http11Probe/docs/smuggling/te-case-mismatch/',
144143
'SMUG-TE-DOUBLE-CHUNKED': '/Http11Probe/docs/smuggling/te-double-chunked/',
@@ -155,7 +154,38 @@ window.ProbeRender = (function () {
155154
'SMUG-TRAILER-CL': '/Http11Probe/docs/smuggling/trailer-cl/',
156155
'SMUG-TRAILER-HOST': '/Http11Probe/docs/smuggling/trailer-host/',
157156
'SMUG-TRAILER-TE': '/Http11Probe/docs/smuggling/trailer-te/',
158-
'SMUG-TRANSFER_ENCODING': '/Http11Probe/docs/smuggling/transfer-encoding-underscore/'
157+
'SMUG-TRANSFER_ENCODING': '/Http11Probe/docs/smuggling/transfer-encoding-underscore/',
158+
'COMP-CHUNKED-HEX-UPPERCASE': '/Http11Probe/docs/body/chunked-hex-uppercase/',
159+
'COMP-CHUNKED-TRAILER-VALID': '/Http11Probe/docs/body/chunked-trailer-valid/',
160+
'COMP-CONNECTION-CLOSE': '/Http11Probe/docs/headers/connection-close/',
161+
'COMP-CONNECT-ORIGIN-FORM': '/Http11Probe/docs/request-line/connect-origin-form/',
162+
'COMP-HOST-EMPTY-VALUE': '/Http11Probe/docs/host-header/host-empty-value/',
163+
'COMP-HTTP10-DEFAULT-CLOSE': '/Http11Probe/docs/headers/http10-default-close/',
164+
'COMP-HTTP10-NO-HOST': '/Http11Probe/docs/host-header/http10-no-host/',
165+
'COMP-HTTP12-VERSION': '/Http11Probe/docs/request-line/http12-version/',
166+
'COMP-METHOD-TRACE': '/Http11Probe/docs/request-line/method-trace/',
167+
'COMP-REQUEST-LINE-TAB': '/Http11Probe/docs/request-line/request-line-tab/',
168+
'COMP-TRACE-WITH-BODY': '/Http11Probe/docs/request-line/trace-with-body/',
169+
'COMP-VERSION-LEADING-ZEROS': '/Http11Probe/docs/request-line/version-leading-zeros/',
170+
'COMP-VERSION-MISSING-MINOR': '/Http11Probe/docs/request-line/version-missing-minor/',
171+
'COMP-VERSION-WHITESPACE': '/Http11Probe/docs/request-line/version-whitespace/',
172+
'MAL-POST-CL-HUGE-NO-BODY': '/Http11Probe/docs/malformed-input/post-cl-huge-no-body/',
173+
'MAL-RANGE-OVERLAPPING': '/Http11Probe/docs/malformed-input/range-overlapping/',
174+
'MAL-URL-BACKSLASH': '/Http11Probe/docs/malformed-input/url-backslash/',
175+
'MAL-URL-OVERLONG-UTF8': '/Http11Probe/docs/malformed-input/url-overlong-utf8/',
176+
'MAL-URL-PERCENT-CRLF': '/Http11Probe/docs/malformed-input/url-percent-crlf/',
177+
'MAL-URL-PERCENT-NULL': '/Http11Probe/docs/malformed-input/url-percent-null/',
178+
'SMUG-ABSOLUTE-URI-HOST-MISMATCH': '/Http11Probe/docs/smuggling/absolute-uri-host-mismatch/',
179+
'SMUG-CHUNK-BARE-CR-TERM': '/Http11Probe/docs/smuggling/chunk-bare-cr-term/',
180+
'SMUG-CL-DOUBLE-ZERO': '/Http11Probe/docs/smuggling/cl-double-zero/',
181+
'SMUG-CL-LEADING-ZEROS-OCTAL': '/Http11Probe/docs/smuggling/cl-leading-zeros-octal/',
182+
'SMUG-CL-NEGATIVE-ZERO': '/Http11Probe/docs/smuggling/cl-negative-zero/',
183+
'SMUG-CL-UNDERSCORE': '/Http11Probe/docs/smuggling/cl-underscore/',
184+
'SMUG-MULTIPLE-HOST-COMMA': '/Http11Probe/docs/smuggling/multiple-host-comma/',
185+
'SMUG-TE-OBS-FOLD': '/Http11Probe/docs/smuggling/te-obs-fold/',
186+
'SMUG-TE-TAB-BEFORE-VALUE': '/Http11Probe/docs/smuggling/te-tab-before-value/',
187+
'SMUG-TE-TRAILING-COMMA': '/Http11Probe/docs/smuggling/te-trailing-comma/',
188+
'SMUG-TRAILER-CONTENT-TYPE': '/Http11Probe/docs/smuggling/trailer-content-type/'
159189
};
160190

161191
function testUrl(tid) {
@@ -202,8 +232,8 @@ window.ProbeRender = (function () {
202232
var s = sv.summary;
203233
var total = s.total || 1;
204234
var warnings = s.warnings || 0;
205-
var failed = total - s.passed - warnings;
206-
var passPct = (s.passed / total) * 100;
235+
var failed = s.failed || 0;
236+
var passPct = ((total - warnings - failed) / total) * 100;
207237
var warnPct = (warnings / total) * 100;
208238
var failPct = (failed / total) * 100;
209239
var rank = i + 1;
@@ -354,14 +384,30 @@ window.ProbeRender = (function () {
354384
injectScrollStyle();
355385
var el = document.getElementById(targetId);
356386
if (!el) return;
357-
var html = '';
387+
388+
// Find tests in this category that aren't in any explicit group
389+
var grouped = {};
358390
groups.forEach(function (g) {
391+
g.testIds.forEach(function (tid) { grouped[tid] = true; });
392+
});
393+
var allCatTests = ctx.testIds.filter(function (tid) {
394+
return ctx.lookup[ctx.names[0]][tid] && ctx.lookup[ctx.names[0]][tid].category === categoryKey;
395+
});
396+
var ungrouped = allCatTests.filter(function (tid) { return !grouped[tid]; });
397+
398+
var allGroups = groups.slice();
399+
if (ungrouped.length > 0) {
400+
allGroups.push({ key: 'other', label: 'Other', testIds: ungrouped });
401+
}
402+
403+
var html = '';
404+
allGroups.forEach(function (g) {
359405
var divId = targetId + '-' + g.key;
360406
html += '<h3 style="margin-top:1.5em;margin-bottom:0.3em;">' + g.label + '</h3>';
361407
html += '<div id="' + divId + '"></div>';
362408
});
363409
el.innerHTML = html;
364-
groups.forEach(function (g) {
410+
allGroups.forEach(function (g) {
365411
var divId = targetId + '-' + g.key;
366412
renderTable(divId, categoryKey, ctx, g.testIds);
367413
});

src/Http11Probe.Cli/Reporting/ConsoleReporter.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ public static void PrintRow(TestResult result)
2626
_ => (ConsoleColor.Gray, "SKIP")
2727
};
2828

29+
if (!result.TestCase.Scored)
30+
symbol += "*";
31+
2932
var statusStr = result.Response is not null
3033
? result.Response.StatusCode.ToString()
3134
: result.ConnectionState.ToString();
@@ -96,6 +99,9 @@ public static void PrintSummary(TestRunReport report)
9699
Console.ForegroundColor = prev;
97100
}
98101

102+
if (report.UnscoredCount > 0)
103+
Console.Write($" {report.UnscoredCount} unscored");
104+
99105
if (report.SkipCount > 0)
100106
Console.Write($" {report.SkipCount} skipped");
101107

src/Http11Probe/Runner/TestRunReport.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ public sealed class TestRunReport
1212
public int WarnCount => Results.Count(r => r.Verdict == TestVerdict.Warn);
1313
public int SkipCount => Results.Count(r => r.Verdict == TestVerdict.Skip);
1414
public int ErrorCount => Results.Count(r => r.Verdict == TestVerdict.Error);
15+
public int UnscoredCount => Results.Count(r => !r.TestCase.Scored && r.Verdict != TestVerdict.Skip);
1516
}

0 commit comments

Comments
 (0)