Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
374 commits
Select commit Hold shift + click to select a range
ea63ffe
TASK-031: validation fixes — housekeeping (status Done, unworked find…
etr May 11, 2026
2f7b4ea
Merge TASK-031: Handler error-propagation contract (DR-009)
etr May 11, 2026
0acbbf7
TASK-032: DR-008 thread-safety contract stress test
etr May 11, 2026
5aa69d6
TASK-032: validation fixes — housekeeping (status Done, unworked find…
etr May 11, 2026
e7f14c7
Merge TASK-032: Thread-safety contract stress test (DR-008)
etr May 11, 2026
c605ee4
TASK-033: create_webserver builder cleanup (PRD-CFG-REQ-001..004)
etr May 11, 2026
a92ff88
TASK-033: validation fixes — housekeeping (status Done, unworked find…
etr May 14, 2026
3832d3b
Merge TASK-033: create_webserver builder cleanup (PRD-CFG-REQ-001..004)
etr May 14, 2026
8fd0743
TASK-034: build-flag-independent public API + webserver::features()
etr May 14, 2026
99be8c2
TASK-034: validation fixes — security (HAVE_DAUTH guard + test-reques…
etr May 14, 2026
8b4ed30
TASK-034: record unworked validation findings (5 major, 27 minor)
etr May 14, 2026
2c15687
Merge TASK-034: Build-flag-independent public API + webserver::featur…
etr May 18, 2026
ce4e028
TASK-035: smart-pointer register_ws_resource overloads
etr May 18, 2026
5ce53f2
TASK-035: record unworked validation findings (1 major, 19 minor)
etr May 18, 2026
973d96c
Merge TASK-035: Smart-pointer register_ws_resource overloads (PRD-HDL…
etr May 18, 2026
25a53c7
TASK-036: handler return-by-value dispatch cutover
etr May 18, 2026
ef2623a
TASK-036: record unworked validation findings (12 major, 41 minor)
etr May 19, 2026
516e1ab
Merge TASK-036: Handler return-by-value dispatch cutover (PRD-HDL-REQ…
etr May 19, 2026
49f18bd
TASK-037: CI build-flag invariance gate
etr May 19, 2026
9726137
TASK-037: validation fixes — security (read-only GITHUB_TOKEN + SHA-2…
etr May 19, 2026
dbf484b
TASK-037: record unworked validation findings (3 major, 30 minor)
etr May 19, 2026
348699b
Merge TASK-037: CI test for build-flag invariance (PRD-FLG-REQ-001, a…
etr May 19, 2026
6965bba
TASK-038: sanitizer-clean http_response move-semantics test + CI sani…
etr May 19, 2026
a216ec7
TASK-038: mark Done in task index and record unworked validation find…
etr May 19, 2026
c71b0e8
Merge TASK-038: Sanitizer-clean tests for http_response move semantic…
etr May 19, 2026
5bf5b65
TASK-039: Performance acceptance gates for get_headers and sizeof(htt…
etr May 19, 2026
443d943
TASK-039: validation fixes — performance methodology
etr May 19, 2026
a2a7705
TASK-039: record unworked validation findings (4 major, 36 minor)
etr May 19, 2026
9a8f077
Merge TASK-039: Performance acceptance gates for get_headers and size…
etr May 19, 2026
1ea42cb
TASK-040: Rewrite examples/ for the v2.0 lambda-first idiom
etr May 19, 2026
dfe2a8f
TASK-040: validation fixes — examples and scripts
etr May 19, 2026
f9b582e
TASK-040: record unworked validation findings (1 major, 81 minor)
etr May 19, 2026
68c3d6a
Merge TASK-040: Rewrite examples/ for the v2.0 lambda-first idiom (PR…
etr May 19, 2026
d64fdd8
TASK-041: Rewrite README.md for libhttpserver v2.0
etr May 19, 2026
ac557d0
TASK-041: validation fixes — README, check script, task housekeeping
etr May 19, 2026
3ad1cbb
TASK-041: record unworked validation findings (4 major, 31 minor)
etr May 20, 2026
c91555d
Merge TASK-041: Rewrite README.md for libhttpserver v2.0 (PRD §2 docu…
etr May 20, 2026
c84d7fd
TASK-042: Write RELEASE_NOTES.md for v2.0
etr May 20, 2026
818e8d4
TASK-042: validation fixes — check script
etr May 20, 2026
090203c
TASK-042: record unworked validation findings (2 major, 23 minor)
etr May 20, 2026
1da2ee1
Merge TASK-042: Write RELEASE_NOTES.md for v2.0 (PRD §2 documentation…
etr May 20, 2026
9b7b732
TASK-043: Doxygen / inline doc refresh
etr May 20, 2026
61e33c2
TASK-043: mark Done — all action items checked, status updated
etr May 20, 2026
00096cb
TASK-043: record unworked validation findings (4 major, 37 minor)
etr May 20, 2026
c18cc8f
Merge TASK-043: Doxygen / inline doc refresh (PRD §2 documentation NF…
etr May 20, 2026
7071a4c
TASK-044: Bump SOVERSION to 2.0.0 and gate the packaging contract
etr May 20, 2026
99a690b
TASK-044: record unworked validation findings (5 major, 23 minor)
etr May 20, 2026
f73aca5
TASK-044: mark Done in _index.md
etr May 20, 2026
9c61716
Merge TASK-044: SOVERSION bump and packaging (PRD §1 release strategy…
etr May 20, 2026
356bac1
CI: fix lint copyright + tsan races on PR #374
etr May 20, 2026
eb2869a
README: re-sync hello-world snippet after copyright add
etr May 20, 2026
e6d7dcc
CI: fix pre-existing Windows MSYS+MINGW64 build failures
etr May 20, 2026
18a855c
CI: skip doxygen on Windows MINGW64 + extend stress-test budget
etr May 21, 2026
9527b98
CI: add cyclomatic complexity + copy/paste duplication gates
etr May 21, 2026
b176669
websocket_handler: dedupe send_ping / send_pong scaffolding
etr May 21, 2026
60b4c64
webserver: decompose start() under the CCN 10 bar (51 -> 8)
etr May 21, 2026
32dfdf1
webserver: decompose finalize_answer under the CCN 10 bar (46 -> 6)
etr May 21, 2026
b24eb7c
http_utils: decompose ip_representation string ctor under CCN 10 (34 …
etr May 21, 2026
adba72d
webserver: decompose on_methods_ under the CCN 10 bar (28 -> 7)
etr May 21, 2026
5b86daf
http_endpoint: decompose string ctor under the CCN 10 bar (22 -> 7)
etr May 21, 2026
368bf85
webserver: decompose post_iterator under the CCN 10 bar (21 -> 7)
etr May 21, 2026
2494c46
ip_representation::operator< + http_request_impl::populate_all_cert_f…
etr May 21, 2026
374a203
webserver: three near-bar refactors (register_impl_ / decode_websocke…
etr May 21, 2026
16e8925
Final CCN-10 ratchet: three near-bar refactors + bar to 10
etr May 21, 2026
9c3d09c
test: cover the pure helpers extracted in the CCN-10 sweep
etr May 21, 2026
6eb3c4c
specs: lifecycle hook bus (DR-012 + TASK-045..052)
etr May 21, 2026
4dd7217
TASK-045: Hook bus skeleton (hook_phase, hook_action, hook_handle, ad…
etr May 21, 2026
b3d2b53
TASK-045: housekeeping — mark Done + persist validation review notes
etr May 22, 2026
120edcd
Merge TASK-045 (Hook bus skeleton) into feature/v2.0
etr May 22, 2026
0a1e42e
ci: per-file line-count gate (FILE_LOC_MAX)
etr May 22, 2026
3ab0963
refactor: extract ip_representation from http_utils.hpp (505 → 478)
etr May 22, 2026
3d5474e
refactor: extract auth surface from http_request.hpp (656 → 497)
etr May 22, 2026
8464996
refactor: split webserver_impl.hpp (674 → 330)
etr May 22, 2026
7fc443a
refactor: extract ip_representation impl from http_utils.cpp (730 → 493)
etr May 22, 2026
d6a2728
refactor: split webserver.hpp (845 → 498) into routes/ws/hooks
etr May 22, 2026
39dd971
refactor: split http_request.cpp 4-way (1175 → 392)
etr May 22, 2026
15f8083
refactor: split webserver.cpp 7-way + drop FILE_LOC_MAX to 500
etr May 22, 2026
827320c
docs: restore reference-manual README
etr May 23, 2026
9625379
TASK-046: fire connection_opened / accept_decision / connection_closed
etr May 23, 2026
1b942d9
TASK-046: housekeeping — mark Done, simplify gates, persist review notes
etr May 25, 2026
1e158a7
TASK-047: fire request_received and body_chunk hooks (pre-handler sho…
etr May 25, 2026
a40705b
docs(TASK-047): mark Done in index; fix hooks table source file refs
etr May 25, 2026
d223607
TASK-047: persist unworked review notes (0 critical, 6 major, 27 minor)
etr May 25, 2026
2f6cb27
TASK-048: fire route_resolved + before_handler; wire 404/405/auth ali…
etr May 25, 2026
f9e095d
TASK-048: graduate auth/405 aliases to functional hooks + perf
etr May 26, 2026
67dd238
Merge TASK-048 (route_resolved + before_handler + 404/405/auth aliase…
etr May 26, 2026
83eb784
TASK-049: fire handler_exception + wire internal_error_handler alias
etr May 26, 2026
8d705a9
TASK-049: housekeeping — mark Done, persist review notes (0 critical,…
etr May 26, 2026
102f073
Merge TASK-049 (handler_exception + internal_error_handler alias) int…
etr May 26, 2026
bed6ad3
TASK-050: fire after_handler / response_sent / request_completed + lo…
etr May 26, 2026
b278f8a
TASK-050: housekeeping — mark Done, persist review notes (0 critical,…
etr May 26, 2026
873359e
Merge TASK-050 (after_handler + response_sent + request_completed + l…
etr May 26, 2026
91e9126
TASK-051: per-route hooks via http_resource::add_hook
etr May 26, 2026
82fc856
TASK-051: housekeeping — mark Done, persist review notes (0 critical,…
etr May 27, 2026
2555450
Merge TASK-051 (per-route hooks via http_resource::add_hook) into fea…
etr May 27, 2026
63a8fda
TASK-051: persist second-pass review notes (2026-05-26_230100)
etr May 27, 2026
830a929
TASK-052: Hook bus doc/example/bench/stress closeout
etr May 27, 2026
86771ad
TASK-052: housekeeping — mark Done, persist review notes (0 critical,…
etr May 27, 2026
4460479
TASK-052: persist second-pass review notes (2026-05-27_010619)
etr May 27, 2026
25adf48
Merge TASK-052 (Hook bus doc/example/bench/stress closeout) into feat…
etr May 27, 2026
3a6e8de
TASK-027 review: fix 3 critical findings
etr May 27, 2026
fd8ec96
TASK-052: address post-completion second-pass review findings
etr May 27, 2026
6b69fef
Merge TASK-052 review cleanup (31/34 fixed, 3 deferred bench design)
etr May 27, 2026
803bdfb
Merge TASK-027 review cleanup (3 criticals fixed; majors+minors pending)
etr May 27, 2026
3e03f45
TASK-027 review: mark 3 criticals as resolved (commit 3a6e8de)
etr May 27, 2026
6e55621
TASK-016 review: address critical + majors + ~half of minors
etr May 27, 2026
c0c779e
Merge TASK-016 review cleanup (24/50 fixed; 26 minors pending)
etr May 27, 2026
b206c80
TASK-016 review: complete remaining minor cleanup pass
etr May 27, 2026
47e926d
Merge TASK-016 remaining minors (47/50 resolved, 3 deferred)
etr May 27, 2026
22d8f07
TASK-036 review: fix callback=nullptr and counter isolation
etr May 27, 2026
5d49d42
TASK-036 review: condition variable for sentinel test + comment trim
etr May 27, 2026
3801286
TASK-027 review: majors+minors cleanup pass
etr May 27, 2026
a11e5ee
TASK-036 review: document auth_handler_ptr deferral (findings 4 & 7)
etr May 27, 2026
17bfe16
Merge TASK-027 majors+minors (37/59 resolved, 22 deferred)
etr May 27, 2026
5d21408
TASK-036 review: collapse duplicate route_entry construction (finding 8)
etr May 27, 2026
7973dc2
TASK-036 review: rename response_ -> response + CWE-209 warning (find…
etr May 27, 2026
4f583fe
Merge TASK-036 majors (10/12 fixed); 43 minors pending follow-up
etr May 27, 2026
bd64fbc
TASK-015: review cleanup batch — fix 7 major + mark/annotate all 64 f…
etr May 27, 2026
a934d43
TASK-044 review cleanup: address all 5 majors and 22 of 23 minors
etr May 27, 2026
ca11b1a
TASK-032 review cleanup: address 5 majors + 18 minors from unworked r…
etr May 27, 2026
d5e03f4
Merge TASK-015 review cleanup (18/64 fixed, 46 deferred)
etr May 27, 2026
ff7a58b
TASK-032 review: mark all 38 items in unworked review doc
etr May 27, 2026
bc97146
Merge TASK-044 review cleanup (27/28 fixed, 1 deferred)
etr May 27, 2026
7499844
Merge TASK-032 review cleanup (29/38 fixed, 4 deferred)
etr May 27, 2026
72614c0
TASK-036 minors: address 43 unchecked minor review items
etr May 27, 2026
76d130e
TASK-003 review cleanup: fix 1 major + 16 minor items
etr May 27, 2026
1cc7883
TASK-036 minors: continue marking remaining items (40 still pending v…
etr May 27, 2026
014ad36
Merge TASK-036 minors (13/43 marked; 30 still need review)
etr May 27, 2026
329aad9
TASK-001 review: CI matrix doc + supply-chain TODOs + ChangeLog fixes
etr May 27, 2026
bbb1c3a
TASK-048 review: alias unification + serialize_allow_methods extracti…
etr May 27, 2026
c12a142
TASK-005 review: fix 3 major findings (logic-in-test loop pattern)
etr May 27, 2026
477a06f
TASK-007 review cleanup: address cosmetic and minor behavioral findings
etr May 27, 2026
dff19e5
TASK-007 review: broaden HYGIENE_STAMP deps to include Makefile.am an…
etr May 27, 2026
9db77d0
TASK-009 review: address majors+minors in http_response/body/modded_r…
etr May 27, 2026
6fb206b
fix(TASK-006): resolve 2 major + 22 minor unworked review items
etr May 27, 2026
a0864be
TASK-001 review: mark items based on commit 329aad9 + verifications
etr May 27, 2026
7fd952a
Merge TASK-006 review cleanup (28/35 fixed, 7 deferred)
etr May 27, 2026
1d1822e
TASK-005 review: fix minor findings (comments, static_assert bound, n…
etr May 27, 2026
4386694
Merge TASK-001 review cleanup (15/26 dispositioned, 11 deferred)
etr May 27, 2026
f4d8ceb
TASK-005 review: mark items in 2026-05-02_230828_task-005.md
etr May 27, 2026
d599af7
Merge TASK-005 review cleanup (23/35 fixed, 12 deferred)
etr May 28, 2026
3029a49
TASK-009 review: mark items based on commit 9db77d0
etr May 28, 2026
b5cd8ff
TASK-048 review: mark items based on commits bbb1c3a + prior merges
etr May 28, 2026
851ba83
TASK-007 review: mark items + create_test_request improvements
etr May 28, 2026
6ab871b
Merge TASK-009 review cleanup (21/52 marked, 31 deferred)
etr May 28, 2026
01b2a6e
Merge TASK-048 review cleanup (25/59 marked, 34 deferred)
etr May 28, 2026
c3521a6
TASK-018 review: get_arg_flat early-return + querystring docs (stray …
etr May 28, 2026
07d7b4a
TASK-042: address 23/25 review issues (2 major, 21 minor)
etr May 28, 2026
cbc0b49
TASK-042: mark review issues resolved in unworked_review_issues tracker
etr May 28, 2026
1c063ee
TASK-025 review cleanup: security fallback, comments, spec docs
etr May 28, 2026
b1c3d75
Merge TASK-042 review cleanup (23/25 fixed, 2 deferred)
etr May 28, 2026
f803932
Merge TASK-025 review cleanup (18/40 fixed, 22 deferred)
etr May 28, 2026
ecf4664
TASK-027: dedupe first-pass review vs second-pass (all 10 items super…
etr May 28, 2026
8ab571c
Merge TASK-027 earlier-pass dedupe (10/10 dispositioned, all superseded)
etr May 28, 2026
c9c0c28
TASK-018 review: mark items addressed by commit c3521a6 (stray agent …
etr May 28, 2026
1275e2a
manual-validation: cross-cutting fixes in webserver_register/request/…
etr May 28, 2026
24f6ca7
TASK-019 review cleanup: address 14 of 31 review findings
etr May 28, 2026
299f1bb
Merge TASK-019 review cleanup (20/31 marked, 13 deferred)
etr May 28, 2026
a3140db
TASK-008 + TASK-038 strays: body code + review/spec/_index updates
etr May 28, 2026
a1f6d0f
manual-validation: mark items based on prior commits + dispositions
etr May 28, 2026
d9e4799
TASK-013 review: address majors+minors in http_response, body, respon…
etr May 28, 2026
ec2c969
Merge manual-validation (7/56 marked, 49 deferred)
etr May 28, 2026
46860bc
Merge TASK-013 review cleanup
etr May 28, 2026
68d27b7
TASK-038 review cleanup: replace LT_CHECK(true), add comments, rename…
etr May 28, 2026
f758eac
TASK-013/TASK-002 review markings (stray)
etr May 28, 2026
eb54b22
TASK-037 review cleanup: fix 3 major + address 30 minor items
etr May 28, 2026
937d0e0
Merge TASK-038 review cleanup (all 28 dispositioned)
etr May 28, 2026
0c01d87
Merge TASK-037 review cleanup (all 33 dispositioned)
etr May 28, 2026
1902763
TASK-039 review cleanup: bench harness refactor + doc/comment polish …
etr May 28, 2026
1c26fbb
TASK-040: examples and scripts cleanup (Tier-5 review fixes)
etr May 28, 2026
7eb3c4f
TASK-039 review spec: mark 36 fixed, 4 deferred inline
etr May 28, 2026
8ffa1d0
fix/task-002-review-cleanup: address 3 major + 24 minor review findings
etr May 28, 2026
4ff196a
Merge TASK-002 review cleanup (27/30 fixed, 3 deferred)
etr May 28, 2026
c8d168a
TASK-040 review: partial marking pass (18 of 82 dispositioned)
etr May 28, 2026
cc7193c
Merge TASK-040 review cleanup (18/82 partial)
etr May 28, 2026
3ede578
fix/task-017-review-cleanup: address 23/24 minor findings (Tier 6)
etr May 28, 2026
680368a
Merge TASK-017 review cleanup (23/24 fixed, 1 deferred)
etr May 28, 2026
2455eb8
Merge TASK-039 review cleanup (36/40 fixed, 4 deferred)
etr May 28, 2026
263c126
fix/task-045-review-cleanup: address 4 major + 26 minor review findings
etr May 28, 2026
f25756e
TASK-014 review: address majors+minors in http_endpoint, webserver_im…
etr May 28, 2026
2765300
Merge TASK-045 review cleanup (all 34 dispositioned)
etr May 28, 2026
b6690cc
Merge TASK-014 review cleanup
etr May 28, 2026
2a592cf
TASK-031 review: cross-cutting fixes (webserver_request, dispatch hel…
etr May 28, 2026
749907b
TASK-031 review markings (stray agent work)
etr May 28, 2026
10c975a
Merge TASK-031 review code work
etr May 28, 2026
4566a62
fix/task-046-review-cleanup: address 24 minor findings from TASK-046 …
etr May 28, 2026
7fa3dc0
fix/task-046-review-cleanup: mark all 24 minor findings resolved in spec
etr May 28, 2026
3603d6b
fix/task-033-review-cleanup: address 28/37 findings (4 major + 24 min…
etr May 28, 2026
16319a8
Merge TASK-046 review cleanup (10 fixed + 3 already + 11 deferred)
etr May 28, 2026
1e1ba39
Merge TASK-033 review cleanup (27/37 fixed, 9 deferred)
etr May 28, 2026
7240714
TASK-029 review cleanup: block_ip restructure + stop_and_wait docs
etr May 28, 2026
9c1ccc1
Merge TASK-029 (all 6 majors + minors)
etr May 28, 2026
a978a72
TASK-041 review: README + cross-cutting + scripts cleanup
etr May 28, 2026
1738257
Merge TASK-041 review cleanup
etr May 28, 2026
f98529a
TASK-004 review: address majors+minors in body, iovec, headers
etr May 28, 2026
d9043a2
Merge TASK-004 review cleanup
etr May 28, 2026
45521b7
TASK-043 review cleanup: doc improvements and check-doxygen.sh hardening
etr May 28, 2026
b491d77
Merge TASK-043 review cleanup (40/41 fixed)
etr May 28, 2026
a18e8af
TASK-047 review: hook bus optimizations + cleanup across webserver de…
etr May 28, 2026
077c33c
Merge TASK-047 review cleanup
etr May 28, 2026
f3ed586
fix: remove leftover conflict marker in hook_handle.cpp
etr May 28, 2026
900dc11
TASK-049 review: address majors+minors in webserver_aliases, hook bus…
etr May 28, 2026
4844979
Merge TASK-049 review cleanup
etr May 28, 2026
b0dd192
TASK-011 + TASK-012 review: http_response/http_utils cleanup (combine…
etr May 28, 2026
176d2ef
TASK-020 review: webserver+websocket+http_utils cleanup (from agent s…
etr May 28, 2026
14d462b
TASK-050: Tier 6 minor review cleanup (48 items)
etr May 28, 2026
f77f7cd
Merge TASK-050 review cleanup
etr May 28, 2026
dacbee0
TASK-034 review cleanup: address 5 majors + 13 minors from 2026-05-14…
etr May 28, 2026
07fd9dd
Merge TASK-034 review cleanup (5 majors + 13 minors)
etr May 28, 2026
d5dd7fd
TASK-051 Tier 3: address 2nd-pass review findings (fix/task-051-2nd-r…
etr May 28, 2026
759a5d7
Merge TASK-051 2nd-pass review cleanup
etr May 28, 2026
d10f591
TASK-023 Tier 4 review cleanup: address 4 majors + 26 minors
etr May 28, 2026
0aa3564
Merge TASK-023 review cleanup
etr May 28, 2026
b4dd363
TASK-024 review: webserver register path/prefix cleanup
etr May 28, 2026
7d05d90
Merge TASK-024 review cleanup
etr May 28, 2026
9129a30
Merge branch 'feature/v2.0' into fix/task-035-review-cleanup
etr May 28, 2026
fab0c13
TASK-035 Tier 5 review cleanup: 1 major + 16 minors (skip 3 no-action)
etr May 28, 2026
ff649ee
Merge TASK-035 review cleanup
etr May 28, 2026
f32db26
TASK-051: annotate 1st-pass review issues against 2nd-pass fixes
etr May 28, 2026
d300fcf
Merge TASK-051 1st-pass dedupe
etr May 28, 2026
118eb8e
TASK-026 review cleanup: address 1 major + 17 minors (30 total, 12 al…
etr May 28, 2026
7dff13c
TASK-026: mark all 30 review items in 2026-05-10_195020_task-026.md
etr May 28, 2026
a3d9994
TASK-024 + TASK-026 review markings (stray agent work)
etr May 28, 2026
80108a7
Merge TASK-026 review cleanup
etr May 28, 2026
cce2e15
TASK-021: 1st-pass review cleanup — strip task-tag comments, tidy sta…
etr May 28, 2026
85f2538
Merge TASK-021 1st-pass review cleanup
etr May 28, 2026
b739f53
fix/task-021-2nd-review: close UB window and remove redundant test
etr May 28, 2026
44cf0d1
fix/task-021-2nd-review: mark all 31 items resolved or deferred
etr May 28, 2026
cce21aa
Merge TASK-021 2nd-pass review cleanup (final Tier 1-5 file)
etr May 28, 2026
9621322
Mark [ ] → [x] for items where *Status:* indicates resolved
etr May 28, 2026
1916df6
Final sweep: mark task-008 items addressed by prior commits
etr May 28, 2026
9dbc291
review backlog: Pass 1 — disposition all unworked items in 22 review …
etr May 28, 2026
fbfefde
review backlog: Pass 2A — examples security fixes + REGRESSION.md drift
etr May 28, 2026
9057146
review backlog: Pass 3 — close scope-routed TASK-009 deferrals
etr May 28, 2026
a23dd77
review backlog: Pass 4 — flip ready-to-close items + cosmetic wontfix
etr May 28, 2026
15c053b
plan: v2.0 deferred backlog — 7 follow-up tasks (TASK-053 to TASK-059)
etr May 28, 2026
00d57e2
Merge TASK-007 2nd-pass review cleanup (HYGIENE_STAMP + minors)
etr May 28, 2026
db36c0f
TASK-054: migrate auth_handler_ptr to optional<http_response>
etr May 29, 2026
a8cac42
TASK-054: mark all action items done and set Status: Done
etr May 29, 2026
2118212
TASK-054: capture unworked review issues report
etr May 30, 2026
7e3c77f
Merge TASK-054: auth_handler_ptr → optional<http_response>
etr May 30, 2026
639c817
TASK-055: sanitize default 500 body; opt-in expose_exception_messages
etr May 30, 2026
9e6c2e5
TASK-055: capture unworked review issues report
etr May 30, 2026
ed37461
Merge TASK-055: sanitize default 500 body / DR-009 Revision 1
etr May 30, 2026
50525b4
TASK-056: hash-DoS hardening + prefix/exact terminus collision guard
etr May 30, 2026
8dfb558
TASK-056 validation iter1: address reviewer findings
etr May 30, 2026
8b478dc
TASK-056: formally defer bench_route_lookup criterion to TASK-053
etr May 30, 2026
09c4dcc
TASK-056: capture unworked review issues report
etr May 30, 2026
24d1b49
TASK-056: simplify reject_terminus_collision
etr May 30, 2026
371b7bc
Merge TASK-056: hash-DoS hardening + prefix/exact terminus collision …
etr May 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
13 changes: 13 additions & 0 deletions .codacy.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
# Codacy project configuration.
#
# specs/ holds internal groundwork artifacts (product specs, architecture
# notes, task records, review notes). They are not user-facing docs and are
# not subject to the same markdown style as README/ChangeLog/CONTRIBUTING.
#
# test/*.md are internal test-suite documents (e.g. the v2.0 routing
# regression gate at test/REGRESSION.md). Same rationale as specs/.
exclude_paths:
- 'specs/**'
- 'test/*.md'
- 'test/**/*.md'
361 changes: 276 additions & 85 deletions .github/workflows/verify-build.yml

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
*.sw*
*.*~
*~
*.in
*.php
*.pm
Expand Down Expand Up @@ -60,3 +61,5 @@ libtool
.worktrees
.claude
CLAUDE.md
.groundwork-plans/
.DS_Store
34 changes: 34 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,5 +1,29 @@
Version 2.0.0

v2.0 release. See RELEASE_NOTES.md for the full v1->v2 porting summary.
SOVERSION bumped: shared library now ships as libhttpserver.so.2
(Linux) / libhttpserver.2.dylib (Darwin). Parallel-installable
with any prior libhttpserver.so.0/1 on disk (runtime artefacts
only; dev-time .la/.a/.pc/headers are last-installer-wins by
design).
Added per-function cyclomatic complexity gate
(scripts/check-complexity.sh via `lizard`) and copy/paste
detection gate (scripts/check-duplication.sh via PMD CPD with
the C++ tokenizer), wired into the existing CI lint lane and
exposed locally as `make lint-complexity` /
`make lint-duplication`. Initial CCN ceiling intentionally set
above the current worst offender so CI stays green; ratcheted
down per refactor commit until reaching the long-term target
of 10. Duplication gate runs at PMD's default
minimum-tokens=100 from day one (currently zero hits).

Version 0.20.0

Raised minimum C++ standard to C++20. Build now requires gcc >= 11
or clang >= 13 (Apple Clang from Xcode 15+). Updated
AX_CXX_COMPILE_STDCXX macro (m4/ax_cxx_compile_stdcxx.m4) to
serial 25 to support C++20 detection. Pruned CI matrix rows
(gcc-9, clang-11, clang-12) that lack full C++20 support.
Raised minimum libmicrohttpd requirement to 1.0.0.
Migrated Basic Auth to v3 API (MHD_basic_auth_get_username_password3,
MHD_queue_basic_auth_required_response3) with UTF-8 support.
Expand All @@ -20,6 +44,16 @@ Version 0.20.0
suppress_date_header.
Added WebSocket support (conditional on HAVE_WEBSOCKET):
websocket_handler, websocket_session, register_ws_resource().
TASK-035: replaced the raw-pointer
register_ws_resource(string, websocket_handler*) overload with
smart-pointer overloads register_ws_resource(string,
unique_ptr<websocket_handler>) and register_ws_resource(string,
shared_ptr<websocket_handler>); added unregister_ws_resource(string).
Mirrors the TASK-023 register_resource ownership model and is
consistent with DR-010 / PRD-HDL-REQ-003 / PRD-HDL-REQ-005.
Duplicate registrations now throw std::invalid_argument
(previously a silent overwrite). On HAVE_WEBSOCKET-off builds
all three entry points throw feature_unavailable.
Added utility functions: reason_phrase(), is_feature_supported(),
get_mhd_version().
Added example and documentation for serving binary data from memory
Expand Down
434 changes: 432 additions & 2 deletions Makefile.am

Large diffs are not rendered by default.

9 changes: 5 additions & 4 deletions README.CentOS-7
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
## Cent OS 7 / RHEL 7

CentOS 7 has a lower version of gcc (4.8.7) that is barely C++11 capable and this library
needs a better compiler. We recommend at least gcc 5+
CentOS 7's stock gcc (4.8.7) is far too old: this library requires a C++20 compiler
(gcc >= 11 or clang >= 13).

We recommend installing devtoolset-8
https://www.softwarecollections.org/en/scls/rhscl/devtoolset-8/
Install gcc-toolset-14 (or newer) from the RHEL/CentOS Software Collections and
`source /opt/rh/gcc-toolset-14/enable` before configuring. The same workaround applies
to RHEL 9 systems whose stock gcc-11 lacks some C++20 library features.
4,042 changes: 1,571 additions & 2,471 deletions README.md

Large diffs are not rendered by default.

294 changes: 294 additions & 0 deletions RELEASE_NOTES.md

Large diffs are not rendered by default.

35 changes: 28 additions & 7 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.57)
m4_define([libhttpserver_MAJOR_VERSION],[0])dnl
m4_define([libhttpserver_MINOR_VERSION],[20])dnl
m4_define([libhttpserver_MAJOR_VERSION],[2])dnl
m4_define([libhttpserver_MINOR_VERSION],[0])dnl
m4_define([libhttpserver_REVISION],[0])dnl
m4_define([libhttpserver_PKG_VERSION],[libhttpserver_MAJOR_VERSION.libhttpserver_MINOR_VERSION.libhttpserver_REVISION])dnl
m4_define([libhttpserver_LDF_VERSION],[libhttpserver_MAJOR_VERSION:libhttpserver_MINOR_VERSION:libhttpserver_REVISION])dnl
Expand All @@ -44,7 +44,7 @@ AC_LANG([C++])
AC_SYS_LARGEFILE

# Minimal feature-set required
AX_CXX_COMPILE_STDCXX([17])
AX_CXX_COMPILE_STDCXX([20], [noext], [mandatory])

native_srcdir=$srcdir

Expand Down Expand Up @@ -80,10 +80,19 @@ For native Windows binaries, use the MinGW64 shell instead.
ADDITIONAL_LIBS="-lpthread -no-undefined"
NETWORK_LIBS="-lws2_32"
native_srcdir=$(cd $srcdir; pwd -W)
# libmicrohttpd's <microhttpd.h> asserts _SYS_TYPES_FD_SET on Cygwin/MSYS.
# newlib defines that macro via <sys/select.h>, included from <sys/types.h>
# only when __BSD_VISIBLE -- i.e. when _DEFAULT_SOURCE is set. Strict ANSI
# C++ (-std=c++NN, AX_CXX_COMPILE_STDCXX noext) suppresses newlib's
# auto-define, so expose it explicitly here.
CPPFLAGS="-D_DEFAULT_SOURCE $CPPFLAGS"
;;
*-cygwin*)
NETWORK_HEADER="arpa/inet.h"
ADDITIONAL_LIBS="-lpthread -no-undefined"
# See *-msys* note: libmicrohttpd's fd_set check needs _DEFAULT_SOURCE
# under -std=c++NN strict mode.
CPPFLAGS="-D_DEFAULT_SOURCE $CPPFLAGS"
;;
*)
NETWORK_HEADER="arpa/inet.h"
Expand Down Expand Up @@ -127,7 +136,11 @@ if test x"$host" = x"$build"; then
[AC_MSG_ERROR(["microhttpd.h not found"])]
)

CXXFLAGS="-DHTTPSERVER_COMPILATION -D_REENTRANT $LIBMICROHTTPD_CFLAGS $CXXFLAGS"
# -DHTTPSERVER_COMPILATION is intentionally NOT injected globally into
# CXXFLAGS. It is added per-target via AM_CPPFLAGS in src/Makefile.am and
# test/Makefile.am so that examples (and any other consumer-style TUs)
# build through the umbrella header without seeing the internal macro.
CXXFLAGS="-D_REENTRANT $LIBMICROHTTPD_CFLAGS $CXXFLAGS"
LDFLAGS="$LIBMICROHTTPD_LIBS $NETWORK_LIBS $ADDITIONAL_LIBS $LDFLAGS"

cond_cross_compile="no"
Expand All @@ -140,7 +153,9 @@ else
[AC_MSG_ERROR(["microhttpd.h not found"])]
)

CXXFLAGS="-DHTTPSERVER_COMPILATION -D_REENTRANT $CXXFLAGS"
# See note above: HTTPSERVER_COMPILATION is scoped to lib + tests via
# per-directory AM_CPPFLAGS, not injected globally into CXXFLAGS.
CXXFLAGS="-D_REENTRANT $CXXFLAGS"
LDFLAGS="$NETWORK_LIBS $ADDITIONAL_LIBS $LDFLAGS"

cond_cross_compile="yes"
Expand Down Expand Up @@ -221,7 +236,9 @@ AM_LDFLAGS="-lstdc++"

if test x"$debugit" = x"yes"; then
AC_DEFINE([DEBUG],[],[Debug Mode])
AM_CXXFLAGS="$AM_CXXFLAGS -DDEBUG -g -Wall -Wextra -Werror -pedantic -std=c++17 -Wno-unused-command-line-argument -O0"
# -std=c++20 is injected by AX_CXX_COMPILE_STDCXX into the CXX variable,
# not repeated here. Omitting it avoids a double-standard flag conflict.
AM_CXXFLAGS="$AM_CXXFLAGS -DDEBUG -g -Wall -Wextra -Werror -pedantic -Wno-unused-command-line-argument -O0"
AM_CFLAGS="$AM_CXXFLAGS -DDEBUG -g -Wall -Wextra -Werror -pedantic -Wno-unused-command-line-argument -O0"
else
AC_DEFINE([NDEBUG],[],[No-debug Mode])
Expand Down Expand Up @@ -308,7 +325,11 @@ DX_PDF_FEATURE(OFF)
DX_PS_FEATURE(OFF)
DX_INIT_DOXYGEN([$PACKAGE_NAME],[doxyconfig.in])

LDFLAGS="$LDFLAGS -version-number libhttpserver_LDF_VERSION"
# Export the libtool version-number triple so src/Makefile.am can scope it
# to libhttpserver_la_LDFLAGS rather than injecting it into the global LDFLAGS
# (which would affect all link steps, not just the shared library).
LHT_LDF_VERSION="libhttpserver_LDF_VERSION"
AC_SUBST(LHT_LDF_VERSION)

AC_SUBST(LHT_LIBDEPS)
AC_SUBST(AM_CXXFLAGS)
Expand Down
2 changes: 1 addition & 1 deletion doxyconfig.in
Original file line number Diff line number Diff line change
Expand Up @@ -610,7 +610,7 @@ RECURSIVE = NO
# excluded from the INPUT source files. This way you can easily exclude a
# subdirectory from a directory tree whose root is specified with the INPUT tag.

EXCLUDE = test/*
EXCLUDE = test/*

# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
# directories that are symbolic links (a Unix filesystem feature) are excluded
Expand Down
21 changes: 19 additions & 2 deletions examples/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -19,24 +19,41 @@
LDADD = $(top_builddir)/src/libhttpserver.la
AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/src/httpserver/
METASOURCES = AUTO
noinst_PROGRAMS = hello_world service minimal_hello_world custom_error allowing_disallowing_methods handlers hello_with_get_arg args_processing setting_headers custom_access_log minimal_https minimal_file_response minimal_deferred url_registration minimal_ip_ban benchmark_select benchmark_threads benchmark_nodelay deferred_with_accumulator file_upload file_upload_with_callback empty_response_example iovec_response_example pipe_response_example daemon_info external_event_loop turbo_mode binary_buffer_response
# client_cert_auth.cpp ships as a documentation artifact only; it is not
# wired into noinst_PROGRAMS because it depends on extra GnuTLS APIs not
# part of the public libhttpserver consumer surface.
EXTRA_DIST = client_cert_auth.cpp
noinst_PROGRAMS = hello_world shared_state service custom_error allowing_disallowing_methods handlers hello_with_get_arg args_processing setting_headers custom_access_log clf_access_log minimal_https minimal_file_response minimal_deferred url_registration minimal_ip_ban banned_ip_log early_413 per_route_auth benchmark_select benchmark_threads benchmark_nodelay deferred_with_accumulator file_upload file_upload_with_callback empty_response_example iovec_response_example pipe_response_example daemon_info external_event_loop turbo_mode binary_buffer_response

hello_world_SOURCES = hello_world.cpp
shared_state_SOURCES = shared_state.cpp
service_SOURCES = service.cpp
minimal_hello_world_SOURCES = minimal_hello_world.cpp
custom_error_SOURCES = custom_error.cpp
allowing_disallowing_methods_SOURCES = allowing_disallowing_methods.cpp
handlers_SOURCES = handlers.cpp
hello_with_get_arg_SOURCES = hello_with_get_arg.cpp
args_processing_SOURCES = args_processing.cpp
setting_headers_SOURCES = setting_headers.cpp
custom_access_log_SOURCES = custom_access_log.cpp
# TASK-050: CLF-format access logger written as a response_sent hook.
# Demonstrates the resolution of issues #281 and #69 -- with the
# structured response_sent_ctx (status / bytes_queued / elapsed), users
# can write a real CLF / time-taken log line in user code, without a
# library change.
clf_access_log_SOURCES = clf_access_log.cpp
minimal_https_SOURCES = minimal_https.cpp
minimal_file_response_SOURCES = minimal_file_response.cpp
minimal_deferred_SOURCES = minimal_deferred.cpp
deferred_with_accumulator_SOURCES = deferred_with_accumulator.cpp
url_registration_SOURCES = url_registration.cpp
minimal_ip_ban_SOURCES = minimal_ip_ban.cpp
banned_ip_log_SOURCES = banned_ip_log.cpp
early_413_SOURCES = early_413.cpp
# TASK-052: per-route auth via http_resource::add_hook(before_handler).
# Demonstrates that a hook registered on one resource fires only when
# that resource is dispatched -- a private route can require credentials
# without touching sibling routes (DR-012).
per_route_auth_SOURCES = per_route_auth.cpp
benchmark_select_SOURCES = benchmark_select.cpp
benchmark_threads_SOURCES = benchmark_threads.cpp
benchmark_nodelay_SOURCES = benchmark_nodelay.cpp
Expand Down
Loading
Loading