0.13.0 2024-09-04 -------------- - h2: surface (body) write failures through `flush` ([#247](https://github.com/anmonteiro/ocaml-h2/pull/247)) - `Body.Writer.flush` now takes a callback of the type ``([ `Written | ` Closed] -> unit)``, informing the caller whether the previous writes have been written or whether the output channel was closed. 0.12.0 2024-06-23 -------------- - hpack: fix huffman encoding for codes > 24bit ([#229](https://github.com/anmonteiro/ocaml-h2/pull/229)) - h2-eio: don't require `Eio_unix.stream_socket_ty`, allowing the use of mock sockets ([#236](https://github.com/anmonteiro/gluten/pull/236)) - h2: drop the dependency on `httpaf`, use [`httpun-types`](https://ocaml.org/p/httpun-types/latest) instead ([#243](https://github.com/anmonteiro/ocaml-h2/pull/243)) - hpack: use `String.unsafe_get` when the string length is known ([#244](https://github.com/anmonteiro/ocaml-h2/pull/244)) 0.11.0 2023-10-26 -------------- - h2-eio: adapt to Eio v0.12 ([#225](https://github.com/anmonteiro/ocaml-h2/pull/225)) - h2-eio: track sw for gluten ([#215](https://github.com/anmonteiro/ocaml-h2/pull/215)) - h2: Add hpack {= version} constraint ([#214](https://github.com/anmonteiro/ocaml-h2/pull/214)) - h2, hpack, h2-async: Add opam constraints for angstrom and gluten-async ([#212](https://github.com/anmonteiro/ocaml-h2/pull/212)) - h2: read available `Body.Reader.t` immediately upon calling `Body.Reader.schedule_read` ([#238](https://github.com/anmonteiro/ocaml-h2/pull/238)) 0.10.0 2023-03-17 --------------- - hpack: fix a case where hpack would raise an array out of bounds exception ([#183](https://github.com/anmonteiro/ocaml-h2/pull/183)) ([@jonathanjameswatson](https://github.com/jonathanjameswatson)) - h2: (client) handle multiple RST_STREAM frames ([#184](https://github.com/anmonteiro/ocaml-h2/pull/184)) ([@jonathanjameswatson](https://github.com/jonathanjameswatson)) - h2: (client) Fix a race condition with `~flush_headers_immediately:false` and empty request bodies ([#186](https://github.com/anmonteiro/ocaml-h2/pull/186)) - h2: Make `H2.Reqd.error_code` part of the public interface ([#188](https://github.com/anmonteiro/ocaml-h2/pull/188)) - h2: Add `~request_method` argument to `H2.Method.body_length` ([#190](https://github.com/anmonteiro/ocaml-h2/pull/190)) ([@jonathanjameswatson](https://github.com/jonathanjameswatson)) - h2: Don't send any frames on a stream after an `RST_STREAM` frame ([#187](https://github.com/anmonteiro/ocaml-h2/pull/187), [#194](https://github.com/anmonteiro/ocaml-h2/pull/194)) - h2: call error handler on the client if the remote peer closes the commmunication channel ([#177](https://github.com/anmonteiro/ocaml-h2/pull/177), [#196](https://github.com/anmonteiro/ocaml-h2/pull/194)) - h2: when reprioritizing a stream, respect its new priority (accounts for inferred default priority when a dependent stream is not in the tree ([RFC7540§5.3.1](https://www.rfc-editor.org/rfc/rfc7540.html#section-5.3.1))) ([#200](https://github.com/anmonteiro/ocaml-h2/pull/200)) - h2: don't remove parent streams from the scheduler if they have children ([#201](https://github.com/anmonteiro/ocaml-h2/pull/201)) - h2: don't schedule streams as dependencies of others marked for removal ([#205](https://github.com/anmonteiro/ocaml-h2/pull/205)) - h2: revise scheduling algorithm to avoid starvation ([#199](https://github.com/anmonteiro/ocaml-h2/pull/199), [#204](https://github.com/anmonteiro/ocaml-h2/pull/204), reported in [#162](https://github.com/anmonteiro/ocaml-h2/issues/162), thanks [@quernd](https://github.com/quernd)) - h2-eio: adapt to the next gluten-eio version ([#210](https://github.com/anmonteiro/ocaml-h2/pull/210)) 0.9.0 2022-08-14 --------------- - h2: Fix tests on 32-bit platforms ([#152](https://github.com/anmonteiro/ocaml-h2/pull/152)) - h2-mirage: adapt to Conduit v4 and remove `H2_mirage.Server_with_conduit` ([#154](https://github.com/anmonteiro/ocaml-h2/pull/154)) - h2: fix memory leaks related to trailer headers in the server and client implementations ([#159](https://github.com/anmonteiro/ocaml-h2/pull/159) (thanks [@quernd](https://github.com/quernd)!), [#160](https://github.com/anmonteiro/ocaml-h2/pull/160)) - h2: allow configuring `flush_headers_immediately` on the client and default to `false`. This means that h2 will wait for the first request body bytes to be scheduled and batch `HEADERS` and `DATA` frames when sending requests ([#163](https://github.com/anmonteiro/ocaml-h2/pull/163), [#164](https://github.com/anmonteiro/ocaml-h2/pull/164)) - h2: Split `Body.t` into `Body.Writer.t` and `Body.Reader.t` ([#165](https://github.com/anmonteiro/ocaml-h2/pull/165)) - h2: OCaml 5.00 compatibility -- add `seeded_hash` to `scheduler.ml` ([#168](https://github.com/anmonteiro/ocaml-h2/pull/168)) - h2: Use a tail-recursive version of `Angstrom.skip_many`. Fixes a memory leak in long-running connections e.g. gRPC ([#172](https://github.com/anmonteiro/ocaml-h2/pull/172)) - h2-async: Add an OCaml-TLS client to `h2-async` ([#174](https://github.com/anmonteiro/ocaml-h2/pull/174)) - h2: Fix a bug that caused different requests to share the same headers buffer under concurrency ([#182](https://github.com/anmonteiro/ocaml-h2/pull/182)) 0.8.0 2021-04-11 --------------- - h2: scheduler: fix bug that caused zero length DATA frames not to be sent if there were no flow-control credits ([#142](https://github.com/anmonteiro/ocaml-h2/pull/142)) -- reported by [@blandinw](https://github.com/blandinw) - h2,h2-lwt,h2-lwt-unix,h2-async,h2-mirage Add `trailers_handler` to `Connection.request` ([#146](https://github.com/anmonteiro/ocaml-h2/pull/146)) - h2: client / server: fix a security issue that allowed a malicious peer to make h2 allocate as much as it wanted ([#149](https://github.com/anmonteiro/ocaml-h2/pull/149)) 0.7.0 2020-08-09 --------------- - h2: client / server: execute request/response body reads as data frames arrive ([#130](https://github.com/anmonteiro/ocaml-h2/pull/130)) - h2: client / server: only give back flow control tokens after surfacing reads to the application ([#131](https://github.com/anmonteiro/ocaml-h2/pull/131)) - h2: Set a default of 128MiB for the initial receiving window size ([#132](https://github.com/anmonteiro/ocaml-h2/pull/132)) - h2: don't attempt to write frames to an encoder that has closed ([#134](https://github.com/anmonteiro/ocaml-h2/pull/134)) - h2: Handle frame size errors in a more robust manner when parsing ([#133](https://github.com/anmonteiro/ocaml-h2/pull/133)) - h2: Create push streams with the right priority (as per [RFC7540§5.3.5](https://tools.ietf.org/html/rfc7540#section-5.3.5), pushed streams initially depend on their associated stream) ([#136](https://github.com/anmonteiro/ocaml-h2/pull/136)) 0.6.1 2020-05-16 --------------- - h2-async: add Async adapter ([#94](https://github.com/anmonteiro/ocaml-h2/pull/94)) - h2-async: Use [gluten](https://github.com/anmonteiro/gluten) to implement h2-async ([#125](https://github.com/anmonteiro/ocaml-h2/pull/125)) - h2-mirage: Use [gluten](https://github.com/anmonteiro/gluten) to implement h2-mirage ([#120](https://github.com/anmonteiro/ocaml-h2/pull/120)) - h2: Don't put parser in error state when force-closing ([#127](https://github.com/anmonteiro/ocaml-h2/pull/127)) 0.6.0 2020-04-29 -------------- - h2-lwt: Close the communication channel after shutting down the client ([#108](https://github.com/anmonteiro/ocaml-h2/pull/108)) - h2-lwt-unix: fix premature SSL termination in the SSL / TLS runtimes ([#109](https://github.com/anmonteiro/ocaml-h2/pull/109)) - h2-lwt-unix: TLS runtime: adapt to TLS v0.11.0 ([#109](https://github.com/anmonteiro/ocaml-h2/pull/109)) - h2-lwt-unix: feed EOF to the state machine if the socket has been closed -- this is especially important on the client because it allows connections to terminate cleanly. ([#112](https://github.com/anmonteiro/ocaml-h2/pull/112)) - h2: Refactor the `Settings` module API ([#113](https://github.com/anmonteiro/ocaml-h2/pull/113)) - h2-lwt, h2-lwt-unix: Use [gluten](https://github.com/anmonteiro/gluten) to implement the Lwt-based runtimes ([#114](https://github.com/anmonteiro/ocaml-h2/pull/114)) - h2: set a lower bound on Angstrom 0.14.0 ([#118](https://github.com/anmonteiro/ocaml-h2/pull/118)) - h2: in the client implementation, don't report an error if the server has sent an `RST_STREAM` frame after sending a complete response ([#119](https://github.com/anmonteiro/ocaml-h2/pull/119)). - h2-lwt-unix: fix a regression that prevented the SSL / TLS runtimes to negotiate an HTTP/2 connection over the ALPN extension of TLS, in their default implementations ([#122](https://github.com/anmonteiro/ocaml-h2/pull/122)) 0.5.0 2019-12-19 -------------- - h2, h2-lwt, h2-lwt-unix, h2-mirage: Remove support for versions of OCaml lower than 4.06 ([#74](https://github.com/anmonteiro/ocaml-h2/pull/74)) - h2: Expose more information in client error handlers when initiating a connection ([#80](https://github.com/anmonteiro/ocaml-h2/pull/80)) - h2: Make H2.Status.t a strict superset of Httpaf.Status.t ([#83](https://github.com/anmonteiro/ocaml-h2/pull/83)) - h2-lwt, h2-lwt-unix: split HTTPS functions in 2: one that sets up a default secure connection and performs the TLS handshake / accept, and one that is more "raw", i.e. leaves that responsibility to the caller. Also exposes the `socket` type to make it easier to abstract over HTTP / HTTPS ([#84](https://github.com/anmonteiro/ocaml-h2/pull/84)) - h2-lwt, h2-lwt-unix, h2-mirage: Improve the `H2_lwt.IO` interface, don't require a `report_exn` function, only a `state` function that returns the socket state ([#85](https://github.com/anmonteiro/ocaml-h2/pull/85)) - h2, h2-lwt, h2-lwt-unix, h2-mirage: Add support for starting HTTP/2 for "http" URIs. Covers [section 3.2](https://tools.ietf.org/html/rfc7540#section-3.2) of the HTTP/2 specification ([#87](https://github.com/anmonteiro/ocaml-h2/pull/87)) - h2: Fix misinterpretation of the spec where h2 would consider a request / response malformed if it had a non-zero `content-length` header and no DATA frames ([#89](https://github.com/anmonteiro/ocaml-h2/pull/89)) - h2: Add `Request.body_length` and `Response.body_length` ([#90](https://github.com/anmonteiro/ocaml-h2/pull/90)) - h2: Fix a bug that caused DATA frames to be incorrectly chunked when returning a streaming response ([#91](https://github.com/anmonteiro/ocaml-h2/pull/91)) - h2: Drain pending bytes after getting a `Close` report from the runtime ([#92](https://github.com/anmonteiro/ocaml-h2/pull/92)) - h2: Report connection errors for unknown frames that exceed the maximum payload size -- they may not be speaking HTTP/2 ([#93](https://github.com/anmonteiro/ocaml-h2/pull/93)) 0.4.0 2019-11-05 -------------- - h2-mirage: depend on `mirage-conduit` instead of `conduit-mirage`, effectively placing a lower bound of OCaml 4.07 on the next release of h2-mirage ([#67](https://github.com/anmonteiro/ocaml-h2/pull/67)) - h2-lwt-unix: replace the `dune` file (previously written in OCaml) with a `(select)` form to avoid depending on `ocamlfind` ([#68](https://github.com/anmonteiro/ocaml-h2/pull/68)) - h2-lwt, h2-lwt-unix, h2-mirage: Refactor interface code through common `H2_lwt_intf` and expose less (internal) types ([#65](https://github.com/anmonteiro/ocaml-h2/pull/65)) - h2-lwt, h2-lwt-unix, h2-mirage: Expose `Client.is_closed` ([#65](https://github.com/anmonteiro/ocaml-h2/pull/65)) - h2: Don't count peer max concurrent streams based on what the endpoint receives; the endpoint is responsible for selecting it ([#71](https://github.com/anmonteiro/ocaml-h2/pull/71)) - h2: Fix bug in `Headers.remove` that prevented removing the last header pair ([#73](https://github.com/anmonteiro/ocaml-h2/pull/73)) - h2: Fix bug in `Headers.replace` that prevented replacing the last header pair ([#76](https://github.com/anmonteiro/ocaml-h2/pull/76)) - h2-mirage: Adapt to Mirage 3.7 interfaces. `h2_mirage` now requires `conduit-mirage` >= 2.0.2 and `mirage-flow` >= 2.0.0 ([#77](https://github.com/anmonteiro/ocaml-h2/pull/77)) 0.3.0 2019-05-04 -------------- - h2-mirage: Provide `Server` and `Client` functors that take a `Mirage_flow_lwt.S` module as an argument ([#37](https://github.com/anmonteiro/ocaml-h2/pull/37)) - h2: Fix bug in the client implementation that didn't report connection preface errors as soon as they happened ([#38](https://github.com/anmonteiro/ocaml-h2/pull/38)) - h2: optimize the stream scheduler: previously when the writer yielded between writes, a wake up function was registered with all the (active) streams, which required a linear traversal of all the streams. The optimization is to allow every stream to wake up a global writer to which they hold a reference ([#40](https://github.com/anmonteiro/ocaml-h2/pull/40)) - h2: improve handling of received frames against closed streams ([#40](https://github.com/anmonteiro/ocaml-h2/pull/40)) - h2: in the client implementation, call the stream level error handler when receiving an `RST_STREAM` frame ([#42](https://github.com/anmonteiro/ocaml-h2/pull/42)) - h2-lwt-unix: fail earlier when setting up a SSL/TLS server without the depopts being available ([#46](https://github.com/anmonteiro/ocaml-h2/pull/46)) - h2-lwt-unix: improve the default ALPN negotiation mechanism in the SSL binding ([#46](https://github.com/anmonteiro/ocaml-h2/pull/46)) 0.2.0 2019-04-06 -------------- - h2: Fix false negative related to receiving trailer headers with CONTINUATION frames ([#11](https://github.com/anmonteiro/ocaml-h2/pull/11)) - hpack: Fix bug where trying to add an entry to an HPACK dynamic table with 0 capacity resulted in an out-of-bounds array access ([#13](https://github.com/anmonteiro/ocaml-h2/pull/13), [#35](https://github.com/anmonteiro/ocaml-h2/pull/35)) - h2: Add support for the 421 (Misdirected Request) status code as per [RFC7540§9.1.2](https://tools.ietf.org/html/rfc7540#section-9.1.2) ([#15](https://github.com/anmonteiro/ocaml-h2/pull/15)) - h2, h2-lwt, h2-lwt-unix, h2-mirage: Add an HTTP/2 client implementation ([#16](https://github.com/anmonteiro/ocaml-h2/pull/16)) - h2: Remove dependency on the `result` package ([#18](https://github.com/anmonteiro/ocaml-h2/pull/18)) - h2: Track SETTINGS frames that haven't been acknowledged by the peer ([#22](https://github.com/anmonteiro/ocaml-h2/pull/22)) - h2: Don't treat `CONNECT` requests as malformed ([#32](https://github.com/anmonteiro/ocaml-h2/pull/32), [#34](https://github.com/anmonteiro/ocaml-h2/pull/34)) - h2: Respect the initial MAX\_FRAME\_SIZE setting when allocating the underlying buffer for the frame writer ([#34](https://github.com/anmonteiro/ocaml-h2/pull/34)) 0.1.0 2019-03-27 -------------- - Initial public release