290 lines
15 KiB
Markdown
290 lines
15 KiB
Markdown
|
|
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
|