Skip to content

Adjust the readme for GenHTTP 11 - #889

Draft
Kaliumhexacyanoferrat wants to merge 10 commits into
mainfrom
version-11-readme
Draft

Adjust the readme for GenHTTP 11#889
Kaliumhexacyanoferrat wants to merge 10 commits into
mainfrom
version-11-readme

Conversation

@Kaliumhexacyanoferrat

Copy link
Copy Markdown
Owner

No description provided.

Updated dependencies and monitoring tools in the README.
MDA2AV added a commit that referenced this pull request Sep 3, 2026
…and samples for each

The engine had grown a layout that no longer described it. Protocol/ held a
folder called Multiplexed - a word that says how HTTP/2 and HTTP/3 differ from
HTTP/1.1 without saying which of them anything serves - while Http1/ held a
driver alongside its types and the other two folders held a driver alone.
ConnectionDriver dispatched TCP connections without TCP appearing in its name,
and TlsRegistry was TCP-only for the same unstated reason.

The protocol layer is now laid out by what a file does rather than which
protocol reaches it, because the protocol is already in every name:

  Protocol/Drivers/Tcp     TcpDriver, Http1Driver, Http2Driver
  Protocol/Drivers/Quic    Http3Driver
  Protocol/Requests        the request model HTTP/2 and HTTP/3 share
  Protocol/Responses       Http1Responder, StreamedResponder, Http1DateHeader
  Protocol/Sinks           where bytes land, for all three

That sharing is structural rather than incidental, which is why it survives
the move intact. Normalised with protocol names substituted out, Http2Driver
and Http3Driver differ only in their entry signature, where their options
object is built, and a log string: HTTP/3 was specified to keep HTTP/2's
semantics and change the transport, so the six shared types branch on protocol
in exactly one ternary. They are named Streamed* now; their HTTP/1.1
counterparts carry an Http1 prefix, so a folder mixing both still reads.

Certificate types move to Certificates/ but keep the root namespace, so no
consumer needs a new using.

QuicTransportOptions splits out of Http3Options along the same line ioxide
itself draws. Five of those settings are QUIC or UDP and reach QuicEngine,
QuicOptions and UdpOptions; the two QPACK ones are HTTP/3 and reach
Nghttp3Options. EngineOptions now reads Reactor / Tcp / Quic / Http3, which
makes the transport pair symmetric. Defaults are unchanged, so only a caller
that set one of the five has to move it.

Http1Responder's body writer folds into WriteAsync - one state machine instead
of two on every response with a body - and gains a try/finally, so content is
disposed on a HEAD, on a zero-length body, and when the write throws. The
streamed path already did that; the TCP path did not, and neither does Shared's
ResponseHandler, so this engine is now the outlier in the safe direction.

Four more state machines go from the streamed stream adapters, which sat on the
per-write path of every HTTP/2 and HTTP/3 body: three pass-throughs on
StreamedSink.FlushingStream and one on PullStream. Http1WriterStream was
already written this way.

Comments were rewritten rather than trimmed: a one-line summary on all 46
types, a line above every method saying what it does, and seventeen inline
notes kept for what the code cannot say - why Flush is deliberately a no-op,
why the reactors are stopped and then joined, why a chain is built for its
elements and its verdict discarded, and why four files in Protocol/Sinks are
not the equivalents in Engine.Shared (WritingStream's Flush blocks on
FlushAsync, which on a reactor thread waits for a pipe that same thread
completes).

Playground/Samples/Ioxide carries nine samples in the shape PR #889 uses: one
file each for HTTP/1.1, HTTP/2, HTTP/3, TLS, kernel TLS, SNI, rotation, the
three-protocol arrangement, and a showcase that is what Program.cs used to be.
Program.cs is now the runner. Each sample was started and probed rather than
only compiled; kernel TLS could only be checked as far as startup, this machine
having no tls module in tcp_available_ulp.

Benchmarked against the branch point on the same ioxide 0.7.211, four reactors
pinned away from wrk, eight interleaved runs each: 646k req/s against 643k, a
0.44% difference inside a 2% run-to-run spread. No regression.
Kaliumhexacyanoferrat pushed a commit that referenced this pull request Sep 4, 2026
…and samples for each

The engine had grown a layout that no longer described it. Protocol/ held a
folder called Multiplexed - a word that says how HTTP/2 and HTTP/3 differ from
HTTP/1.1 without saying which of them anything serves - while Http1/ held a
driver alongside its types and the other two folders held a driver alone.
ConnectionDriver dispatched TCP connections without TCP appearing in its name,
and TlsRegistry was TCP-only for the same unstated reason.

The protocol layer is now laid out by what a file does rather than which
protocol reaches it, because the protocol is already in every name:

  Protocol/Drivers/Tcp     TcpDriver, Http1Driver, Http2Driver
  Protocol/Drivers/Quic    Http3Driver
  Protocol/Requests        the request model HTTP/2 and HTTP/3 share
  Protocol/Responses       Http1Responder, StreamedResponder, Http1DateHeader
  Protocol/Sinks           where bytes land, for all three

That sharing is structural rather than incidental, which is why it survives
the move intact. Normalised with protocol names substituted out, Http2Driver
and Http3Driver differ only in their entry signature, where their options
object is built, and a log string: HTTP/3 was specified to keep HTTP/2's
semantics and change the transport, so the six shared types branch on protocol
in exactly one ternary. They are named Streamed* now; their HTTP/1.1
counterparts carry an Http1 prefix, so a folder mixing both still reads.

Certificate types move to Certificates/ but keep the root namespace, so no
consumer needs a new using.

QuicTransportOptions splits out of Http3Options along the same line ioxide
itself draws. Five of those settings are QUIC or UDP and reach QuicEngine,
QuicOptions and UdpOptions; the two QPACK ones are HTTP/3 and reach
Nghttp3Options. EngineOptions now reads Reactor / Tcp / Quic / Http3, which
makes the transport pair symmetric. Defaults are unchanged, so only a caller
that set one of the five has to move it.

Http1Responder's body writer folds into WriteAsync - one state machine instead
of two on every response with a body - and gains a try/finally, so content is
disposed on a HEAD, on a zero-length body, and when the write throws. The
streamed path already did that; the TCP path did not, and neither does Shared's
ResponseHandler, so this engine is now the outlier in the safe direction.

Four more state machines go from the streamed stream adapters, which sat on the
per-write path of every HTTP/2 and HTTP/3 body: three pass-throughs on
StreamedSink.FlushingStream and one on PullStream. Http1WriterStream was
already written this way.

Comments were rewritten rather than trimmed: a one-line summary on all 46
types, a line above every method saying what it does, and seventeen inline
notes kept for what the code cannot say - why Flush is deliberately a no-op,
why the reactors are stopped and then joined, why a chain is built for its
elements and its verdict discarded, and why four files in Protocol/Sinks are
not the equivalents in Engine.Shared (WritingStream's Flush blocks on
FlushAsync, which on a reactor thread waits for a pipe that same thread
completes).

Playground/Samples/Ioxide carries nine samples in the shape PR #889 uses: one
file each for HTTP/1.1, HTTP/2, HTTP/3, TLS, kernel TLS, SNI, rotation, the
three-protocol arrangement, and a showcase that is what Program.cs used to be.
Program.cs is now the runner. Each sample was started and probed rather than
only compiled; kernel TLS could only be checked as far as startup, this machine
having no tls module in tcp_available_ulp.

Benchmarked against the branch point on the same ioxide 0.7.211, four reactors
pinned away from wrk, eight interleaved runs each: 646k req/s against 643k, a
0.44% difference inside a 2% run-to-run spread. No regression.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant