[ANN] Cohttp 5.0.0 and 2.5.6

We are glad to announce the release of version 5.0.0 and 2.5.6 of cohttp and its dependent packages.

The latter is a bug fix release that in particular backports the compatibility with the upcoming release 0.15 of core and async.

The first introduces the breaking changes announced in the previous release. I append the changelog below, which explains in details the changes and emphasizes the breaking changes:

  • Cohttp.Header: new implementation (lyrm #747)

    • New implementation of Header modules using an associative list instead of a map, with one major semantic change (function get, see below), and some new functions (clean_dup, get_multi_concat)
    • More Alcotest tests as well as fuzzing tests for this particular module.


    The new header implementation uses an associative list instead of a map to represent headers and is focused on predictability and intuitivity: except for some specific and documented functions, the headers are always kept in transmission order, which makes debugging easier and is also important for RFC7230§3.2.2 that states that multiple values of a header must be kept in order.

    Also, to get an intuitive function behaviour, no extra work to enforce RFCs is done by the basic functions. For example, RFC7230§3.2.2 requires that a sender does not send multiple values for a non list-value header. This particular rule could require the Header.add function to remove previous values of non-list-value headers, which means some changes of the headers would be out of control of the user. With the current implementation, an user has to actively call dedicated functions to enforce such RFCs (here Header.clean_dup).

    Semantic changes

    Two functions have a semantic change : get and update.


    get was previously doing more than just returns the value associated to a key; it was also checking if the searched header could have multiple values: if not, the last value associated to the header was returned; otherwise, all the associated values were concatenated and returned. This semantics does not match the global idea behind the new header implementation, and would also be very inefficient.

    • The new get function only returns the last value associated to the searched header.
    • get_multi_concat function has been added to get a result similar to the previous get function.


    update is a pretty new function (#703) and changes are minor and related to get semantic changes.

    • update h k f is now modifying only the last occurrences of the header k instead of all its occurrences.
    • a new function update_all function has been added and work on all the occurrences of the updated header.

    New functions :

    • clean_dup enables the user to clean headers that follows the RFC7230§3.2.2 (no duplicate, except set-cookie)
    • get_multi_concat has been added to get a result similar to the previous get function.
  • Cohttp.Header: performance improvement (mseri, anuragsoni #778)
    Breaking the headers are no-longer lowercased when parsed, the headers key comparison is case insensitive instead.

  • cohttp-lwt-unix: Adopt ocaml-conduit 5.0.0 (smorimoto #787)
    Breaking Conduit_lwt_unix.connect's ctx param type chaged from ctx to ctx Lazy.t

  • cohttp-mirage: fix deprecated fmt usage (tmcgilchrist #783)

  • lwt_jsoo: Use logs for the warnings and document it (mseri #776)

  • lwt: Use logs to warn users about leaked bodies and document it (mseri #771)

  • lwt, lwt_unix: Improve use of logs and the documentation, fix bug in the Debug.enable_debug function (mseri #772)

  • lwt_jsoo: Fix exception on connection errors in chrome (mefyl #761)

  • lwt_jsoo: Fix Lwt.wakeup_exn Invalid_arg exception when a js
    stack overflow happens in the XHR completion handler (mefyl #762).

  • lwt_jsoo: Add test suite (mefyl #764).

We wish to thank to all the users and the contributors for their help leading to this release.



Note: the issue/PR numbers here do not resolve to clickable URLs. I have a quick&dirty script to markdownify issue/PR numbers which I use when posting fragments of the OCaml changelog. See the whole script here, the relevant part would be:


sed "s,#\([0-9]\+\),#[\\1]($GITHUB/issues/\\1),g" $1

Edited, thanks a lot!