Skip to content

Commit 3a907b2

Browse files
authored
Merge pull request #86 from MDA2AV/fix/pr-probe-comment
Fix PR Probe result comments, update changelog
2 parents 12c26d8 + 2156118 commit 3a907b2

3 files changed

Lines changed: 137 additions & 13 deletions

File tree

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
name: Post Probe Comment
2+
3+
on:
4+
workflow_run:
5+
workflows: ["Probe"]
6+
types: [completed]
7+
8+
jobs:
9+
comment:
10+
name: Post PR Comment
11+
if: >
12+
github.event.workflow_run.event == 'pull_request' &&
13+
github.event.workflow_run.conclusion == 'success'
14+
runs-on: ubuntu-latest
15+
16+
permissions:
17+
pull-requests: write
18+
19+
steps:
20+
- name: Download artifact
21+
uses: actions/download-artifact@v4
22+
with:
23+
name: probe-pr-comment
24+
run-id: ${{ github.event.workflow_run.id }}
25+
github-token: ${{ secrets.GITHUB_TOKEN }}
26+
27+
- name: Post or update comment
28+
run: |
29+
PR_NUMBER=$(cat pr-number.txt)
30+
COMMENT_ID=$(gh api repos/${{ github.repository }}/issues/${PR_NUMBER}/comments \
31+
--jq '.[] | select(.body | contains("<!-- http11probe-results -->")) | .id' | head -1)
32+
if [ -n "$COMMENT_ID" ]; then
33+
gh api repos/${{ github.repository }}/issues/comments/$COMMENT_ID \
34+
-X PATCH -f body="$(cat probe-comment.md)"
35+
else
36+
gh pr comment "$PR_NUMBER" --body-file probe-comment.md
37+
fi
38+
env:
39+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.github/workflows/probe.yml

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ jobs:
1414
runs-on: ubuntu-latest
1515

1616
permissions:
17-
pull-requests: write
1817
contents: write
1918
actions: write
2019

@@ -284,19 +283,18 @@ jobs:
284283
name: probe-results
285284
path: probe-*.json
286285

287-
- name: Comment on PR
286+
- name: Save PR metadata
288287
if: github.event_name == 'pull_request' && steps.changes.outputs.servers != '[]'
289-
run: |
290-
COMMENT_ID=$(gh api repos/${{ github.repository }}/issues/${{ github.event.number }}/comments \
291-
--jq '.[] | select(.body | contains("<!-- http11probe-results -->")) | .id' | head -1)
292-
if [ -n "$COMMENT_ID" ]; then
293-
gh api repos/${{ github.repository }}/issues/comments/$COMMENT_ID \
294-
-X PATCH -f body="$(cat probe-comment.md)"
295-
else
296-
gh pr comment ${{ github.event.number }} --body-file probe-comment.md
297-
fi
298-
env:
299-
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
288+
run: echo '${{ github.event.number }}' > pr-number.txt
289+
290+
- name: Upload PR comment
291+
if: github.event_name == 'pull_request' && steps.changes.outputs.servers != '[]'
292+
uses: actions/upload-artifact@v4
293+
with:
294+
name: probe-pr-comment
295+
path: |
296+
probe-comment.md
297+
pr-number.txt
300298
301299
- name: Push to latest-results
302300
if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main'

CHANGELOG.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,65 @@
22

33
All notable changes to Http11Probe are documented in this file.
44

5+
## [2026-02-16]
6+
7+
### Added
8+
- **Sequence tests** — new multi-step test infrastructure (`SequenceTestCase`, `SequenceStep`, `SequenceSendPart`) for desync and smuggling detection with timed partial sends and behavioral analysis (#74)
9+
- **26 new smuggling tests** — multi-step sequence tests for CL.TE, TE.CL, and desync detection:
10+
- `SMUG-CLTE-SMUGGLED-GET` — CL.TE with embedded GET; multiple responses indicate boundary confusion
11+
- `SMUG-CLTE-SMUGGLED-HEAD` — CL.TE with embedded HEAD
12+
- `SMUG-CLTE-SMUGGLED-GET-CL-PLUS` — CL.TE smuggled GET with malformed CL (+N)
13+
- `SMUG-CLTE-SMUGGLED-GET-CL-NON-NUMERIC` — CL.TE smuggled GET with non-numeric CL
14+
- `SMUG-CLTE-SMUGGLED-GET-TE-OBS-FOLD` — CL.TE smuggled GET with obs-folded TE
15+
- `SMUG-CLTE-SMUGGLED-GET-TE-TRAILING-SPACE` — CL.TE smuggled GET with TE trailing space
16+
- `SMUG-CLTE-SMUGGLED-GET-TE-LEADING-COMMA` — CL.TE smuggled GET with TE leading comma
17+
- `SMUG-CLTE-SMUGGLED-GET-TE-CASE-MISMATCH` — CL.TE smuggled GET with TE case mismatch
18+
- `SMUG-TE-DUPLICATE-HEADERS-SMUGGLED-GET` — duplicate TE headers with embedded GET
19+
- `SMUG-TECL-SMUGGLED-GET` — TE.CL with embedded GET (chunk-size prefix trick)
20+
- `SMUG-DUPLICATE-CL-SMUGGLED-GET` — duplicate Content-Length with embedded GET
21+
- `SMUG-GET-CL-PREFIX-DESYNC` — GET with CL prefix desync
22+
- `SMUG-CLTE-DESYNC` — CL.TE desync with pause-based detection
23+
- `SMUG-TECL-DESYNC` — TE.CL desync with pause-based detection
24+
- `SMUG-CLTE-CONN-CLOSE` — CL.TE desync with Connection: close
25+
- `SMUG-TECL-CONN-CLOSE` — TE.CL desync with Connection: close
26+
- `SMUG-PIPELINE-SAFE` — safe pipeline baseline (no smuggling)
27+
- `SMUG-CL0-BODY-POISON` — CL:0 body poison follow-up check
28+
- `SMUG-GET-CL-BODY-DESYNC` — GET with CL body desync
29+
- `SMUG-OPTIONS-CL-BODY-DESYNC` — OPTIONS with CL body desync
30+
- `SMUG-EXPECT-100-CL-DESYNC` — Expect: 100-continue CL desync
31+
- `SMUG-OPTIONS-TE-OBS-FOLD` — OPTIONS with obs-fold TE follow-up check
32+
- `SMUG-CHUNK-INVALID-SIZE-DESYNC` — invalid chunk size + poison follow-up
33+
- `SMUG-CHUNK-EXT-INVALID-TOKEN` — invalid token in chunk extension name
34+
- `SMUG-CHUNK-SIZE-PLUS` — chunk size with leading plus sign
35+
- `SMUG-CHUNK-SIZE-TRAILING-OWS` — chunk size with trailing whitespace
36+
- **11 new compliance tests**:
37+
- `COMP-RANGE-POST` — Range header on POST should be ignored (RFC 9110 §14.2)
38+
- `COMP-UPGRADE-HTTP10` — Upgrade header in HTTP/1.0 request
39+
- `COMP-DATE-FORMAT` — Date header format validation (RFC 9110 §5.6.7)
40+
- `COMP-VERSION-CASE` — HTTP version case sensitivity (RFC 9112 §2.6)
41+
- `COMP-LONG-URL-OK` — long URL within valid range should be accepted
42+
- `COMP-SPACE-IN-TARGET` — space in request target should be rejected
43+
- `COMP-DUPLICATE-CT` — duplicate Content-Type headers
44+
- `COMP-TRACE-SENSITIVE` — TRACE method security sensitivity (RFC 9110 §9.3.8)
45+
- `COMP-RANGE-INVALID` — invalid Range header format
46+
- `COMP-ACCEPT-NONSENSE` — nonsensical Accept header value
47+
- `COMP-POST-UNSUPPORTED-CT` — POST with unsupported Content-Type
48+
- **FastEndpoints framework** — new test server added to the probe suite (#70)
49+
- **Local probe script**`scripts/probe-local.sh` for running probes against local servers
50+
- **Sequence tests UI** — probe results page displays sequence test steps with per-step request/response details
51+
52+
### Changed
53+
- **SMUG-CLTE-PIPELINE and SMUG-TECL-PIPELINE** — re-evaluated scoring and validation logic
54+
- **GenHTTP server** — clean-up and simplification (contributed by Andreas Nägeli)
55+
- **RFC Requirement Dashboard** — updated with all 37 new tests and counts
56+
57+
### Fixed
58+
- **Traefik server** — fixed POST / to echo request body (contributed by SAILESH4406, #79)
59+
- **Sequence test UI rendering** — fixed display of multi-step test results on probe results page
60+
- **Second read from wire** — improved response capture with additional socket read for slow/partial responses (#71)
61+
- **PR comment score** — fixed score calculation in probe workflow CI comments
62+
- **NGINX server** — fixed implementation (#63)
63+
564
## [2026-02-14]
665

766
### Added
@@ -13,6 +72,9 @@ All notable changes to Http11Probe are documented in this file.
1372
- **`RfcLevel` enum**`Must`, `Should`, `May`, `OughtTo`, `NotApplicable` classification for every test case
1473
- **RFC Level annotations** — all tests across Compliance, Smuggling, MalformedInput, and Normalization suites annotated with their RFC 2119 requirement level
1574
- **Verbose Probe workflow** — new `probe-verbose.yml` GitHub Action for manual single-server probing with `--verbose` output, triggered via `workflow_dispatch` with a server name input (#60)
75+
- **Giscus comments** — added comment system to website documentation pages
76+
- **AI Contribution guide**`AGENTS.md` for AI-agent contributions and `add-with-ai-agent` docs page
77+
- **RFC Requirement Dashboard page** — comprehensive per-test RFC requirement tracking with counts and cross-references
1678
- **9 new RFC 9110 compliance tests** sourced from [mohammed90/http-compliance-testing](https://github.com/mohammed90/http-compliance-testing):
1779
- `COMP-HEAD-NO-BODY` — HEAD response must not contain a message body (RFC 9110 §9.3.2, MUST)
1880
- `COMP-UNKNOWN-METHOD` — unrecognized method should be rejected with 501/405 (RFC 9110 §9.1, SHOULD)
@@ -40,6 +102,31 @@ All notable changes to Http11Probe are documented in this file.
40102
- **Method extraction** — handles leading CRLF in raw requests and tab-delimited request lines; non-HTTP pseudo-methods (PRI) shown as '?'
41103
- **Category-scoped filters** — Method and RFC Level filters now only show options relevant to the current category page
42104

105+
## [2026-02-13]
106+
107+
### Added
108+
- **Server configuration pages** — per-server docs pages showing Dockerfile, source code, and config files for all 36 tested servers (`docs/content/servers/`) (#28)
109+
- **Clickable server names** — server names in the probe results table and summary bar chart now link to their configuration page
110+
- **Sticky first column** — server name column stays pinned to the left edge while scrolling horizontally through result tables
111+
- **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
112+
- **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
113+
- **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
114+
- **Header normalization section** — new test category for header normalization tests (#32)
115+
- **"Add a Framework" section improvements** — expanded documentation for adding new server frameworks (#42)
116+
117+
### Changed
118+
- **Scrollable tooltips** — hover tooltips are now interactive and scrollable for large payloads (removed `pointer-events:none`, increased `max-height` to `60vh`)
119+
- **Larger click modal** — expanded from `max-width:700px` to `90vw` and `max-height` from `80vh` to `85vh` to better accommodate large request/response data
120+
- Raw request capture now includes truncation metadata when payload exceeds 8,192 bytes
121+
- Raw response capture now includes truncation metadata when response exceeds 8,192 bytes
122+
- **Test re-evaluation** — reviewed and re-scored multiple tests for RFC alignment (#29)
123+
124+
### Fixed
125+
- **Kestrel server** — fixed HEAD and OPTIONS headers allowed (#39)
126+
- **Node.js server** — fixed errors in Express server (#37)
127+
- **CLI and PR scores** — fixed score calculation in CLI output and PR comments
128+
- GenHTTP server re-enabled in probe suite
129+
43130
## [2026-02-12]
44131

45132
### Added

0 commit comments

Comments
 (0)