Skip to content

colibri 0.8.0: the server's router, client.Request, h3 deadlines, and the KeyUpdate read fix

Choose a tag to compare

@c4milo c4milo released this 21 Oct 02:20
· 424 commits to main since this release

colibri 0.8.0 gives the server a router and one endpoint for TCP and QUIC, and gives the client client.Request and client.Response. Each module now exports its names from its root alone. It pins chapulin e6e3c1e7 and stdx 5da4397.

Breaking changes

  • Each module exports the names a program calls from its root, and no file (decision 115). A type named after its file has its own name: write h2.Connection for h2.connection.Connection, and the same for http.Field, core.Reader, qpack.Encoder, quic.PeerAddress and the others. A method that only a module's own files call is private.
  • server.Endpoint holds every TCP and QUIC connection, and a program answers each request by its Id (decision 119). server.Config replaces EndpointConfig and takes the TLS identity once. Connection, QuicConnection and QuicConfig leave the root. Endpoint.init returns StartError, with error.DeadlineInvalid for deadlines a connection refuses.
  • versions replaces cleartext on the server and the client, and limits holds the bounds that named h2 (decision 117). A server that allows both versions reads h2's preface in cleartext (RFC 9113 §3.3).
  • server.Limits holds peer_resets_max and resets_sent_max, and server.constants.quic_peer_reset_rate_max is removed. A server refuses a body rate that an honest peer cannot meet over TLS or h2 (decision 110).
  • client.Request and client.Response replace client.HttpExchange (decision 124). client.Config replaces ChannelConfig and takes one tls.Client value. The channel's types lose their prefix: Values, Input, Received, Event, Open and Phase. Connection and QuicConnection leave the root.
  • Channel.start_quic draws a QUIC connection's IDs and grease itself, so QuicStart and QuicStartError leave the root. RequestError names only what Channel.request returns.
  • client.Coding gains zstd and br, so a switch over it must name both.
  • tls.Cpu holds the program's probe and a tls.Timing that the program states (chapulin 0.2.0, decision 97 as amended). tls.quic.version is private.

What's new

  • server.router: literal paths, parameters, a trailing wildcard, and HEAD answered by a route's GET. A table that hides a route does not compile (decision 122).
  • The server runs its deadlines and rate limits over h3 too.
  • The client decodes zstd and br from decoder pools the program places. It sends an idempotent request again once after an unanswered close, and holds a long h11 head over TLS. client.ChannelOf sizes a channel.
  • A tls.Client value can take no tickets, with takes_tickets = false.
  • After a KeyUpdate that asks for an answer, the client and the server read on, and send the answer before their next record of application data (RFC 9846 §4.7.3).

Checked

GitHub's main workflow passed on 7496cdc (run 39183420881).