Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
128 commits
Select commit Hold shift + click to select a range
662a519
build(http): register bounded HTTP crate
seonghobae Aug 9, 2026
a9215b9
build(http): lock bounded HTTP dependencies
seonghobae Aug 9, 2026
b9db53c
feat(http): add bounded HTTP crate manifest
seonghobae Aug 9, 2026
cb37ebe
feat(http): add bounded HTTP public surface
seonghobae Aug 9, 2026
ceaad5d
feat(http): add bounded content decoding
seonghobae Aug 9, 2026
afaf98d
feat(http): add bounded client policy
seonghobae Aug 9, 2026
0dbe3fa
feat(http): add deterministic request serialization
seonghobae Aug 9, 2026
0bd78e5
feat(http): bind canonical request targets
seonghobae Aug 9, 2026
e1bcad2
feat(http): add bounded field validation
seonghobae Aug 9, 2026
7524dfa
feat(http): add strict response framing
seonghobae Aug 9, 2026
ed1db7e
merge(http): align reconstruction with current main
seonghobae Aug 9, 2026
f0deede
feat(http): restore complete production module set
seonghobae Aug 9, 2026
e0d02a6
test(http): register reusable HTTP crate in workspace contract
seonghobae Aug 9, 2026
7a8f70a
test(http): restore chunked wire budget contract
seonghobae Aug 9, 2026
6c9aa9e
test(http): restore coverage contract
seonghobae Aug 9, 2026
ae4a995
test(http): restore timeout restoration contract
seonghobae Aug 9, 2026
ccc40ed
test(http): restore internal HTTP regression suite
seonghobae Aug 9, 2026
823b31a
test(http): restore authenticated HTTP integration suite
seonghobae Aug 9, 2026
053d5f2
style(http): apply canonical Rust formatting
seonghobae Aug 9, 2026
f59adaa
docs(http): restore implementation and security evidence
seonghobae Aug 9, 2026
396dad9
docs(http): add current-lineage HTTP authority ADR
seonghobae Aug 9, 2026
a79519f
docs(http): add reason-phrase diagnostic ADR
seonghobae Aug 9, 2026
c4a774c
docs(http): point chunked doctoring to current ADR
seonghobae Aug 9, 2026
82b05e9
docs(http): point reason diagnostics to current ADR
seonghobae Aug 9, 2026
4b7197f
docs(http): reconcile security doctoring with current ADR
seonghobae Aug 9, 2026
b3e0066
test(http): restore current-lineage governance contracts
seonghobae Aug 9, 2026
d7f05b2
fix(http): restore crates.io lock checksum integrity
seonghobae Aug 9, 2026
a877b5c
Merge branch 'main' into feat/http11-semantics-main
opencode-agent[bot] Aug 9, 2026
403e868
test(http): forbid raw response bytes in Debug output
seonghobae Aug 9, 2026
da7d727
fix(http): redact response payloads from Debug output
seonghobae Aug 9, 2026
0b6058d
test(http): cover UTF-8 sniff-prefix boundary
seonghobae Aug 9, 2026
3d92372
fix(http): preserve valid UTF-8 at MIME sniff boundary
seonghobae Aug 9, 2026
b21e033
test(http): reject trailing gzip members
seonghobae Aug 9, 2026
d1aedf4
fix(http): reject trailing gzip bytes
seonghobae Aug 9, 2026
68eb12e
test(http): verify error source contracts exhaustively
seonghobae Aug 9, 2026
4a5a475
test(http): tolerate post-close server flush failures
seonghobae Aug 9, 2026
4e94c7b
test(http): define HEAD digest integrity semantics
seonghobae Aug 9, 2026
1e01784
fix(http): classify no-content digest contexts
seonghobae Aug 9, 2026
b540fec
fix(http): avoid false digest verification for HEAD
seonghobae Aug 9, 2026
68356c9
test(http): bound aggregate interim header bytes
seonghobae Aug 9, 2026
653925a
fix(http): enforce aggregate response-head budget
seonghobae Aug 9, 2026
7573bfb
docs(http): record Structured Fields supersession
seonghobae Aug 9, 2026
765eef3
docs(http): cite current extended-value RFC
seonghobae Aug 9, 2026
c605157
docs(http): align locked flate2 version
seonghobae Aug 9, 2026
3f0d362
docs(http): align response API declaration
seonghobae Aug 9, 2026
4ae4168
Merge branch 'main' into feat/http11-semantics-main
github-actions[bot] Aug 9, 2026
f419c39
docs(http): correct RFC 9651 authorship
seonghobae Aug 9, 2026
8f66c3c
test(http): cover no-content integrity semantics
seonghobae Aug 9, 2026
26036ed
Merge branch 'main' into feat/http11-semantics-main
github-actions[bot] Aug 9, 2026
fc75949
test(http): register no-content integrity coverage
seonghobae Aug 9, 2026
695a023
style(http): apply canonical exchange formatting
seonghobae Aug 9, 2026
c20452f
style(http): apply canonical integrity formatting
seonghobae Aug 9, 2026
8699fd5
style(http): canonicalize test module ordering
seonghobae Aug 9, 2026
29acfa0
test(http): fix no-content error assertions
seonghobae Aug 9, 2026
3e7bd5d
test(http): execute credential-safe response Debug contract
seonghobae Aug 9, 2026
5956228
test(http): register runtime response Debug coverage
seonghobae Aug 9, 2026
226d38f
ci(coverage): surface missing production lines in logs
seonghobae Aug 9, 2026
6c3eec0
Merge branch 'main' into feat/http11-semantics-main
github-actions[bot] Aug 9, 2026
caac942
ci: drop unrelated coverage diagnostic workflow diff
seonghobae Aug 9, 2026
2d69d87
ci: surface exact coverage gaps for HTTP reconstruction
seonghobae Aug 9, 2026
4ce855a
test(http): cover fail-closed no-content and cumulative head paths
seonghobae Aug 9, 2026
7a4b84a
ci: propagate coverage report failures through tee
seonghobae Aug 9, 2026
cd23e48
style(http): apply canonical rustfmt diagnostics
seonghobae Aug 10, 2026
452c63c
test(http): cover invalid reason phrase at exchange boundary
seonghobae Aug 10, 2026
c628bc8
test(http): cover incomplete oversized status line
seonghobae Aug 10, 2026
06dab07
style(http): format exact coverage regression
seonghobae Aug 10, 2026
8c1d4d1
test(http): cover cumulative incomplete head budget
seonghobae Aug 10, 2026
a6e7a64
test(http): wire cumulative head budget contract
seonghobae Aug 10, 2026
a389806
fix(http): apply canonical module ordering
seonghobae Aug 10, 2026
9becaaf
docs(changelog): preserve rebuilt HTTP authority delta
seonghobae Aug 10, 2026
f44b2f0
test(http): expose no-content and duplicate length framing gaps
seonghobae Aug 11, 2026
df848c5
test(http): apply canonical formatting to framing regressions
seonghobae Aug 11, 2026
26e87d2
test(http): retain RFC same-decimal duplicate semantics
seonghobae Aug 11, 2026
21341af
fix(http): keep no-content metadata outside body budget
seonghobae Aug 11, 2026
7906068
test(http): expose oversized no-content metadata conversion gap
seonghobae Aug 11, 2026
42744e4
fix(http): validate large no-content lengths without narrowing
seonghobae Aug 11, 2026
629fa69
style(http): apply canonical rustfmt diagnostics
seonghobae Aug 11, 2026
73c54f2
test(http): scan nested Rust sources in governance checks
seonghobae Aug 13, 2026
c016f4b
Merge branch 'main' into feat/http11-semantics-main
github-actions[bot] Aug 13, 2026
7a0a69b
test(http): reject MIME parameters from essence constructor
seonghobae Aug 14, 2026
6fc6562
fix(http): keep MIME essence constructor parameter-free
seonghobae Aug 14, 2026
dafcaee
docs(changelog): record parameter-free MIME essence hardening
seonghobae Aug 14, 2026
d039bac
docs(http): index proposed HTTP architecture decisions
seonghobae Aug 14, 2026
a343896
docs(http): register proposed HTTP ADR lifecycle
seonghobae Aug 14, 2026
49ba0fd
style(http): restore canonical rustfmt newline
seonghobae Aug 14, 2026
50e31cf
test(http): reject deprecated 305 redirect metadata
seonghobae Aug 14, 2026
7f56e31
style(http): apply canonical test formatting
seonghobae Aug 14, 2026
f259e41
fix(http): exclude deprecated 305 redirect metadata
seonghobae Aug 14, 2026
9f7345d
test(http): use active redirect status for query metadata
seonghobae Aug 14, 2026
4a9a0f8
test(http): reject unterminated short HTML signatures
seonghobae Aug 15, 2026
7f26753
style(http): apply canonical MIME test formatting
seonghobae Aug 15, 2026
3f13a56
style(http): retain canonical MIME test newline
seonghobae Aug 15, 2026
0c98421
fix(http): require HTML short-signature delimiters
seonghobae Aug 15, 2026
9e33c5c
style(http): apply canonical MIME formatting
seonghobae Aug 15, 2026
43a4b0c
test(http): delimit short HTML region fixtures
seonghobae Aug 15, 2026
e86d1be
test(http): preserve trailer field size diagnostics
seonghobae Aug 15, 2026
fe324f7
fix(http): preserve trailer field size diagnostics
seonghobae Aug 15, 2026
d6b104f
Merge branch 'main' into feat/http11-semantics-main
seonghobae Aug 16, 2026
ff51473
test(http): reject differently spelled duplicate content lengths
seonghobae Aug 17, 2026
0c11908
fix(http): require exact duplicate content-length spelling
seonghobae Aug 17, 2026
87bffae
docs(http): record strict duplicate content-length contract
seonghobae Aug 17, 2026
89b7610
docs(http): note strict duplicate content-length handling
seonghobae Aug 17, 2026
8e03621
test(http): distinguish invalid nosniff metadata
seonghobae Aug 18, 2026
058ead1
fix(http): type invalid nosniff metadata
seonghobae Aug 18, 2026
24a4f32
fix(http): return typed nosniff metadata errors
seonghobae Aug 18, 2026
e26021b
test(http): cover typed nosniff error contract
seonghobae Aug 18, 2026
19ed901
test(http): assert typed nosniff integration failure
seonghobae Aug 18, 2026
fb2cfa3
docs(changelog): record typed nosniff failure
seonghobae Aug 18, 2026
b686685
test(http): align coverage contract with typed nosniff error
seonghobae Aug 18, 2026
4d68918
test(http): reject forbidden 1xx and 204 framing metadata
seonghobae Aug 18, 2026
dbac25f
test(http): wire status-specific framing regressions
seonghobae Aug 18, 2026
e5cd216
fix(http): enforce status-specific framing metadata
seonghobae Aug 18, 2026
fd067eb
fix(http): route final heads through status-aware parser
seonghobae Aug 18, 2026
e259054
test(http): register status-aware response parser module
seonghobae Aug 18, 2026
dba667d
style(http): apply canonical rustfmt to status framing guard
seonghobae Aug 18, 2026
0e1e078
fix(http): preserve raw response-head parser test surface
seonghobae Aug 18, 2026
c95542a
fix(http): preserve raw final parser as assembly authority
seonghobae Aug 18, 2026
85387f2
test(http): cover checked response-head parser edges
seonghobae Aug 18, 2026
85e4867
test(http): reject unterminated HTML tag signatures
seonghobae Aug 18, 2026
24062b7
test(http): enforce HTML tag termination
seonghobae Aug 18, 2026
a6c856b
test(http): format tag-termination regression
seonghobae Aug 18, 2026
db86a57
test(http): cover exact and BOM-prefixed pseudo-tags
seonghobae Aug 18, 2026
dab354b
fix(http): guard HTML tag signature boundaries
seonghobae Aug 18, 2026
e20de06
fix(http): activate tag-boundary MIME facade
seonghobae Aug 18, 2026
2a47bde
test(http): pin WHATWG HTML tag terminators
seonghobae Aug 18, 2026
94849f6
fix(http): enforce MIME tag terminators at classifier
seonghobae Aug 18, 2026
2ac59cb
style(http): apply canonical rustfmt
seonghobae Aug 18, 2026
097e51e
style(http): satisfy strict clippy
seonghobae Aug 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,12 +87,14 @@ jobs:
--json
--output-path coverage.json
- name: Record uncovered production lines
run: >-
cargo +nightly-2026-08-01 llvm-cov report
--branch
--text
--show-missing-lines
> missing-lines.txt
shell: bash
run: |
set -o pipefail
cargo +nightly-2026-08-01 llvm-cov report \
--branch \
--text \
--show-missing-lines \
| tee missing-lines.txt
- name: Upload exact coverage diagnostics
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
Expand Down
13 changes: 12 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ All notable changes to OriginWeave are documented in this file. The format follo
- Authenticated `originweave-tls` service-identity boundary that consumes an existing verified TCP stream, requires exact TLS-origin and transport-origin equality, derives RFC 9525 DNS or literal-IP reference identity only from the canonical HTTPS origin, validates WebPKI with explicit roots and fixed time, permits only TLS 1.2 and TLS 1.3, and never reconnects or resolves.
- Bounded TLS policy for total handshake time, ALPN identifiers, trust-root count and bytes, and server-presented certificate count and bytes, with explicit optional-versus-required ALPN behavior and `NotConfigured` revocation evidence.
- Credential-free TLS evidence containing canonical origin, requested and observed peer, DNS/IP reference identity, TLS version, cipher-suite identifier, selected ALPN or explicit absence, leaf certificate and SPKI hashes, server-presented certificate hashes and bounds, trust-bundle identity and hash, validity interval, fixed verification time, revocation configuration, and measured handshake duration.
- Bounded single-use `originweave-http` HTTP/1.1 `GET`/`HEAD` authority over the already authenticated TLS stream, with strict RFC 9110/9112 framing, one monotonic exchange deadline, encoded/decoded/chunk/trailer budgets, RFC 9530 digest validation, conservative MIME/disposition handling, redirect metadata without automatic follow, and immutable credential-free evidence.
- Exact HTTP/1.1 reason-phrase octets retained separately on `AuthenticatedHttpResponse` for bounded diagnostics, including obs-text, while remaining excluded from credential-free evidence and all semantic decisions.
- Credential-free connection and redirect evidence containing canonical addresses, destination classes, target digests, hop numbers, and approved-address counts.
- Credential-free verified TCP evidence containing the logical origin, requested socket, observed peer, destination class, successful attempt number, and per-attempt timeout.
- Standard `Display` and `std::error::Error` contracts for destination, redirect, digest, direct-network, and TLS failures, including preserved destination-policy, rustls, and operating-system sources where applicable.
Expand All @@ -36,9 +38,16 @@ All notable changes to OriginWeave are documented in this file. The format follo
- Separated logical origin authority from resolved network destination authority; an origin grant no longer implies permission to connect to every resolver result.
- Separated resolved-address authorization from direct transport evidence; an approved IP now becomes a usable stream only after the operating system reports the exact requested IP and port.
- Separated exact TCP peer proof from authenticated TLS service identity; an observed peer becomes an authenticated HTTPS stream only after explicit-root, fixed-time, SAN-bound WebPKI verification over that same stream.
- Reserved HTTP response-coding negotiation to the serializer that owns the gzip and zlib-deflate decoder set; caller `Accept-Encoding` fields now fail closed instead of combining with the fixed negotiation and advertising unsupported codings.
- Tightened HTTP/1.1 duplicate `Content-Length` handling so comma-separated or repeated decimal members must be byte-identical after optional whitespace is trimmed; numerically equal but differently spelled members such as `042` and `42` now fail closed as conflicting framing evidence.
- Restricted raw ASCII in HTTP origin-form request targets to RFC 3986 path/query characters; disallowed delimiters and unsafe punctuation now fail closed unless supplied through a valid percent escape, while non-ASCII UTF-8 remains percent-encoded.
- Chunked HTTP/1.1 responses now complete at the terminal zero chunk plus bounded trailer terminator instead of waiting for peer TLS closure; close-delimited responses still require authenticated TLS EOF, and the stream remains single-use.
- Overlong chunked trailer lines now fail as `TrailerSectionTooLarge` against the trailer-section budget, while malformed trailer line endings retain their chunked-syntax error classification.
- MIME essence construction now enforces its parameter-free contract: reviewed type/subtype inputs that introduce MIME parameters fail closed instead of manufacturing a parameterized `MimeType`.
- Invalid `X-Content-Type-Options` metadata now fails with the dedicated `InvalidNoSniffDirective` error instead of being misclassified as malformed `Content-Type` MIME syntax.
- Replaced single resource-pressure directives with a cumulative mitigation plan so simultaneous RAM, VRAM, frame, model, and admission pressure cannot discard required actions.
- Changed generic network capture from finite deny-lists or safe-name allow-lists to unconditional value redaction. Typed metadata values and bodies now require a separate schema-specific capture contract.
- Updated the first Chromium slice to distinguish implemented origin, destination, direct TCP, and TLS identity kernels from the remaining trusted DNS adapter, proxy/PAC, HTTP budget, MIME, download, and Chromium integration required before safe navigation can be claimed.
- Updated the first Chromium slice to distinguish implemented origin, destination, direct TCP, TLS identity, and bounded HTTP/MIME kernels from the remaining trusted DNS adapter, proxy/PAC execution, browser download handoff, and Chromium integration required before safe navigation can be claimed.
- Separated hourly product PR publication authority from the organization review and merge system, and added live default-branch and release-blocker rechecks immediately before publication.
- Made the agent-development contract work-conserving: completing one bounded slice, RCA, review request, check, merge, or documentation change is an intermediate state; maintenance must return to the live queue, treat waits as item-local, and perform a mandatory exit sweep before terminating while executable OriginWeave work remains.
- Moved autonomous-agent Cargo targets and Python bytecode caches outside the proposed source tree and prefetched locked Cargo dependencies for offline verification.
Expand Down Expand Up @@ -69,6 +78,8 @@ All notable changes to OriginWeave are documented in this file. The format follo
- The operating-system peer is rechecked before, during, and after the deadline-bound TLS handshake.
- ALPN selection is restricted to the caller's bounded allow-list, while absence is either explicitly recorded or rejected by policy.
- Revocation is reported as not configured; the product makes no OCSP or CRL validation claim without supplied revocation evidence.
- HTTP/1.1 status, framing, content coding, integrity, MIME, disposition, and redirect decisions never depend on the untrusted reason phrase; exact reason bytes are available only as bounded diagnostics and are not copied into credential-free evidence.
- Safe `Content-Disposition` filename metadata rejects Windows reserved device names using both ASCII digits and the Windows-recognized ISO/IEC 8859-1 superscript digits in `COM`/`LPT` names before any later download handoff.
- Every generic network header and query value is redacted before evidence leaves the trusted boundary, including conventionally benign field names containing attacker-controlled bytes.
- Evidence capture enforces count and byte bounds and rejects credential-bearing source URLs, query strings, fragments, controls, whitespace, malformed percent escapes, encoded separators, dot segments, and backslash paths.
- Hard RAM and VRAM pressure pauses the active agent and rejects new admission; hard VRAM pressure also offloads a resident local model.
Expand Down
56 changes: 56 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,22 @@ members = [
"crates/originweave-destination",
"crates/originweave-network",
"crates/originweave-tls",
"crates/originweave-http",
]
resolver = "3"

[workspace.package]
version = "0.1.0"
edition = "2024"
rust-version = "1.97"
rust-version = "1.97.1"
license = "Apache-2.0"
authors = ["Contextual Wisdom Lab"]
repository = "https://github.com/ContextualWisdomLab/OriginWeave"
homepage = "https://github.com/ContextualWisdomLab/OriginWeave"

[workspace.lints.rust]
unsafe_code = "forbid"
unexpected_cfgs = { level = "warn", check-cfg = ["cfg(coverage_nightly)"] }

[workspace.lints.clippy]
dbg_macro = "deny"
Expand Down
25 changes: 25 additions & 0 deletions crates/originweave-http/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
[package]
name = "originweave-http"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
authors.workspace = true
repository.workspace = true
homepage.workspace = true

[dependencies]
base64 = "=0.22.1"
flate2 = { version = "=1.1.9", default-features = false, features = ["rust_backend"] }
originweave-core = { path = "../originweave-core" }
originweave-tls = { path = "../originweave-tls" }
sha2 = "=0.10.9"

[dev-dependencies]
originweave-destination = { path = "../originweave-destination" }
originweave-network = { path = "../originweave-network" }
rcgen = "=0.14.8"
rustls = { version = "=0.23.42", default-features = false, features = ["ring", "std", "tls12"] }

[lints]
workspace = true
Loading
Loading