2025-11-24 17:01.45: New job: test robur-coop/httpcats https://github.com/robur-coop/httpcats.git#refs/heads/upgrade-distrib (857acfc0554dc5815ec3f92efd18dee992d0d934) (linux-x86_64:(lint-fmt)) Base: ocaml/opam:debian-13-ocaml-4.08@sha256:e3cc4e8fe5c00f48c72a719e3551b1d8a51c2862349a0f7507e8aa29fdf72321 ocamlformat version: version 0.28.1 (from opam) To reproduce locally: git clone --recursive "https://github.com/robur-coop/httpcats.git" -b "upgrade-distrib" && cd "httpcats" && git reset --hard 857acfc0 cat > Dockerfile <<'END-OF-DOCKERFILE' FROM ocaml/opam:debian-13-ocaml-4.08@sha256:e3cc4e8fe5c00f48c72a719e3551b1d8a51c2862349a0f7507e8aa29fdf72321 USER 1000:1000 RUN cd ~/opam-repository && (git cat-file -e 6c1b38620288b5bf349067f089a7b1fc91185d94 || git fetch origin master) && git reset -q --hard 6c1b38620288b5bf349067f089a7b1fc91185d94 && git log --no-decorate -n1 --oneline && opam update -u RUN opam depext -i dune WORKDIR /src RUN opam depext -i ocamlformat=0.28.1 COPY --chown=1000:1000 . /src/ RUN opam exec -- dune build @fmt --ignore-promoted-rules || (echo "dune build @fmt failed"; exit 2) END-OF-DOCKERFILE docker build . END-REPRO-BLOCK 2025-11-24 17:01.45: Using cache hint "robur-coop/httpcats-ocaml/opam:debian-13-ocaml-4.08@sha256:e3cc4e8fe5c00f48c72a719e3551b1d8a51c2862349a0f7507e8aa29fdf72321-debian-13-4.08_opam-2.4-ocamlformat-6c1b38620288b5bf349067f089a7b1fc91185d94" 2025-11-24 17:01.45: Using OBuilder spec: ((from ocaml/opam:debian-13-ocaml-4.08@sha256:e3cc4e8fe5c00f48c72a719e3551b1d8a51c2862349a0f7507e8aa29fdf72321) (user (uid 1000) (gid 1000)) (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "cd ~/opam-repository && (git cat-file -e 6c1b38620288b5bf349067f089a7b1fc91185d94 || git fetch origin master) && git reset -q --hard 6c1b38620288b5bf349067f089a7b1fc91185d94 && git log --no-decorate -n1 --oneline && opam update -u")) (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "opam depext -i dune")) (workdir /src) (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "opam depext -i ocamlformat=0.28.1")) (copy (src .) (dst /src/)) (run (shell "opam exec -- dune build @fmt --ignore-promoted-rules || (echo \"dune build @fmt failed\"; exit 2)")) ) 2025-11-24 17:01.45: Waiting for resource in pool OCluster 2025-11-24 17:01.45: Waiting for worker… 2025-11-24 17:01.45: Got resource from pool OCluster Building on clete HEAD is now at 2650559 Set the port for tests (from 8080 to 9451) HEAD is now at 857acfc Replace 127.0.0.1 to localhost (from ocaml/opam:debian-13-ocaml-4.08@sha256:e3cc4e8fe5c00f48c72a719e3551b1d8a51c2862349a0f7507e8aa29fdf72321) 2025-11-24 17:01.46 ---> using "d458486dd7823c592e7ea9c88366c5f90e1939c3b51f3abbd6760272096f8a3e" from cache /: (user (uid 1000) (gid 1000)) /: (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "cd ~/opam-repository && (git cat-file -e 6c1b38620288b5bf349067f089a7b1fc91185d94 || git fetch origin master) && git reset -q --hard 6c1b38620288b5bf349067f089a7b1fc91185d94 && git log --no-decorate -n1 --oneline && opam update -u")) 6c1b386202 Merge pull request #28774 from Julow/release-ocamlformat-0.28.1 <><> Updating package repositories ><><><><><><><><><><><><><><><><><><><><><><> [default] Initialised default (at git+file:///home/opam/opam-repository): [INFO] opam 2.1 and 2.2 include many performance and security improvements over 2.0; please consider upgrading (https://opam.ocaml.org/doc/Install.html) Everything as up-to-date as possible (run with --verbose to show unavailable upgrades). However, you may "opam upgrade" these packages explicitly, which will ask permission to downgrade or uninstall the conflicting packages. Nothing to do. # Run eval $(opam env) to update the current shell environment 2025-11-24 17:01.46 ---> using "a7d3c7d9f6aff7dc059c465a33e7ef3fda4b4a1ee9c79bef8645b5cd4da72b96" from cache /: (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "opam depext -i dune")) # Detecting depexts using vars: arch=x86_64, os=linux, os-distribution=debian, os-family=debian # No extra OS packages requirements found. # All required OS packages found. # Now letting opam install the packages The following actions will be performed: - install dune 3.20.2 <><> Gathering sources ><><><><><><><><><><><><><><><><><><><><><><><><><><><><> [dune.3.20.2] found in cache <><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><> -> installed dune.3.20.2 Done. # Run eval $(opam env) to update the current shell environment 2025-11-24 17:01.46 ---> using "b8799a0f87a66bd49a9341889a0027044c03db80ad17a5edb3adaf72f166d8fd" from cache /: (workdir /src) /src: (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "opam depext -i ocamlformat=0.28.1")) # Detecting depexts using vars: arch=x86_64, os=linux, os-distribution=debian, os-family=debian # No extra OS packages requirements found. # All required OS packages found. # Now letting opam install the packages The following actions will be performed: - install sexplib0 v0.14.0 [required by base] - install ocamlbuild 0.16.1 [required by fpath, astring, uuseg] - install either 1.0.0 [required by ocamlformat-lib] - install menhirLib 20250912 [required by ocamlformat-lib] - install csexp 1.5.2 [required by ocamlformat] - install camlp-streams 5.0.1 [required by ocamlformat-lib] - install seq base [required by re] - install menhirSdk 20250912 [required by ocamlformat-lib] - install fix 20250919 [required by ocamlformat-lib] - install menhirCST 20250912 [required by menhir] - install ocamlfind 1.9.8 [required by ocp-indent, astring, fpath, uuseg] - install dune-build-info 3.20.2 [required by ocamlformat-lib] - install cmdliner 2.0.0 [required by ocamlformat] - install ocaml-version 4.0.3 [required by ocamlformat-lib] - install dune-configurator 3.20.2 [required by base] - install re 1.11.0 [required by ocamlformat] - install menhir 20250912 [required by ocamlformat-lib] - install topkg 1.1.1 [required by fpath, astring, uuseg] - install ocp-indent 1.9.0 [required by ocamlformat-lib] - install base v0.14.3 [required by ocamlformat-lib] - install uutf 1.0.4 [required by ocamlformat-lib] - install astring 0.8.5 [required by ocamlformat-lib] - install stdio v0.14.0 [required by ocamlformat-lib] - install uucp 15.0.0 [required by uuseg] - install fpath 0.7.3 [required by ocamlformat-lib] - install uuseg 15.0.0 [required by ocamlformat-lib] - install ocamlformat-lib 0.28.1 [required by ocamlformat] - install ocamlformat 0.28.1 ===== 28 to install ===== <><> Gathering sources ><><><><><><><><><><><><><><><><><><><><><><><><><><><><> [astring.0.8.5] found in cache [base.v0.14.3] found in cache [camlp-streams.5.0.1] found in cache [cmdliner.2.0.0] found in cache [csexp.1.5.2] found in cache [dune-build-info.3.20.2] found in cache [dune-configurator.3.20.2] found in cache [either.1.0.0] found in cache [fix.20250919] found in cache [fpath.0.7.3] found in cache [menhir.20250912] found in cache [menhirCST.20250912] found in cache [menhirLib.20250912] found in cache [menhirSdk.20250912] found in cache [ocaml-version.4.0.3] found in cache [ocamlbuild.0.16.1] found in cache [ocamlfind.1.9.8] found in cache [ocamlformat.0.28.1] found in cache [ocamlformat-lib.0.28.1] found in cache [ocp-indent.1.9.0] found in cache [re.1.11.0] found in cache [sexplib0.v0.14.0] found in cache [stdio.v0.14.0] found in cache [topkg.1.1.1] found in cache [uucp.15.0.0] found in cache [uuseg.15.0.0] found in cache [uutf.1.0.4] found in cache <><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><> -> installed seq.base -> installed camlp-streams.5.0.1 -> installed csexp.1.5.2 -> installed either.1.0.0 -> installed fix.20250919 -> installed menhirCST.20250912 -> installed menhirLib.20250912 -> installed menhirSdk.20250912 -> installed cmdliner.2.0.0 -> installed ocaml-version.4.0.3 -> installed re.1.11.0 -> installed sexplib0.v0.14.0 -> installed dune-build-info.3.20.2 -> installed dune-configurator.3.20.2 -> installed ocamlfind.1.9.8 -> installed ocp-indent.1.9.0 -> installed ocamlbuild.0.16.1 -> installed base.v0.14.3 -> installed topkg.1.1.1 -> installed stdio.v0.14.0 -> installed uutf.1.0.4 -> installed astring.0.8.5 -> installed fpath.0.7.3 -> installed menhir.20250912 -> installed uucp.15.0.0 -> installed uuseg.15.0.0 -> installed ocamlformat-lib.0.28.1 -> installed ocamlformat.0.28.1 Done. <><> ocp-indent.1.9.0 installed successfully ><><><><><><><><><><><><><><><><><> => This package requires additional configuration for use in editors. Install package 'user-setup', or manually: * for Emacs, add these lines to ~/.emacs: (add-to-list 'load-path "/home/opam/.opam/4.08/share/emacs/site-lisp") (require 'ocp-indent) * for Vim, add this line to ~/.vimrc: set rtp^="/home/opam/.opam/4.08/share/ocp-indent/vim" # Run eval $(opam env) to update the current shell environment 2025-11-24 17:01.46 ---> using "7b71439e6ac9917292b28dc59ecc075d01d03dd2ef11c372809a6cf99e594a22" from cache /src: (copy (src .) (dst /src/)) 2025-11-24 17:01.47 ---> saved as "baa90ab6ede48fbebfd165bda3c418f733b02418369543f3f6263f518d5f6579" /src: (run (shell "opam exec -- dune build @fmt --ignore-promoted-rules || (echo \"dune build @fmt failed\"; exit 2)")) File "src/http_miou_server.ml", line 1, characters 0-0: diff --git a/_build/default/src/http_miou_server.ml b/_build/default/src/.formatted/http_miou_server.ml index 20bf118..b759ac8 100644 --- a/_build/default/src/http_miou_server.ml +++ b/_build/default/src/.formatted/http_miou_server.ml @@ -253,11 +253,9 @@ let clear ?(parallel = true) ?stop ?(config = H1.Config.default) ?backlog ?ready Log.debug (fun m -> m "receive a connection from: %a" pp_sockaddr sockaddr); clean_up orphans; - call ~orphans - begin - fun () -> - http_1_1_server_connection ~config ~user's_error_handler ?upgrade - ~user's_handler fd' + call ~orphans begin fun () -> + http_1_1_server_connection ~config ~user's_error_handler ?upgrade + ~user's_handler fd' end; go orphans file_descr in @@ -299,19 +297,18 @@ let with_tls ?(parallel = true) ?stop let fn () = try let tls_flow = Tls_miou_unix.server_of_fd tls_config fd' in - begin - match (config, alpn tls_flow) with - | `Both (_, h2), Some "h2" | `H2 h2, (Some "h2" | None) -> - Log.debug (fun m -> m "Start a h2 request handler"); - h2s_server_connection ~config:h2 ~user's_error_handler - ?upgrade ~user's_handler tls_flow - | `Both (config, _), Some "http/1.1" - | `HTTP_1_1 config, (Some "http/1.1" | None) -> - Log.debug (fun m -> m "Start a http/1.1 request handler"); - https_1_1_server_connection ~config ~user's_error_handler - ?upgrade ~user's_handler tls_flow - | `Both _, None -> assert false - | _, Some _protocol -> assert false + begin match (config, alpn tls_flow) with + | `Both (_, h2), Some "h2" | `H2 h2, (Some "h2" | None) -> + Log.debug (fun m -> m "Start a h2 request handler"); + h2s_server_connection ~config:h2 ~user's_error_handler ?upgrade + ~user's_handler tls_flow + | `Both (config, _), Some "http/1.1" + | `HTTP_1_1 config, (Some "http/1.1" | None) -> + Log.debug (fun m -> m "Start a http/1.1 request handler"); + https_1_1_server_connection ~config ~user's_error_handler + ?upgrade ~user's_handler tls_flow + | `Both _, None -> assert false + | _, Some _protocol -> assert false end with exn -> Log.err (fun m -> @@ -422,19 +419,18 @@ module Websocket = struct match Bstream.get oc with | None -> () | Some (kind, data) -> - begin - match kind with - | `Other -> failwith "Unsupported frame of kind `Other" - | `Connection_close -> - Wsd.close wsd; Bstream.close oc; Ws_stop.set_emmited stop; () - | `Ping -> Wsd.send_ping wsd - | `Pong -> Wsd.send_pong wsd - | `Msg (kind, is_fin) -> - let len = String.length data in - Wsd.send_bytes wsd ~kind ~is_fin - (Bytes.unsafe_of_string data) - ~off:0 ~len; - () + begin match kind with + | `Other -> failwith "Unsupported frame of kind `Other" + | `Connection_close -> + Wsd.close wsd; Bstream.close oc; Ws_stop.set_emmited stop; () + | `Ping -> Wsd.send_ping wsd + | `Pong -> Wsd.send_pong wsd + | `Msg (kind, is_fin) -> + let len = String.length data in + Wsd.send_bytes wsd ~kind ~is_fin + (Bytes.unsafe_of_string data) + ~off:0 ~len; + () end; go () in File "src/httpcats.ml", line 1, characters 0-0: diff --git a/_build/default/src/httpcats.ml b/_build/default/src/.formatted/httpcats.ml index f41266d..f63a9b6 100644 --- a/_build/default/src/httpcats.ml +++ b/_build/default/src/.formatted/httpcats.ml @@ -54,28 +54,28 @@ let decode_uri uri = else Error (`Msg "Unknown protocol")) >>= fun (scheme, is_tls) -> (match String.split_on_char '@' user_pass_host_port with - | [ host_port ] -> Ok (None, host_port) - | [ user_pass; host_port ] -> - decode_user_pass user_pass >>= fun up -> Ok (Some up, host_port) - | _ -> Error (`Msg "Couldn't decode URI")) + | [ host_port ] -> Ok (None, host_port) + | [ user_pass; host_port ] -> + decode_user_pass user_pass >>= fun up -> Ok (Some up, host_port) + | _ -> Error (`Msg "Couldn't decode URI")) >>= fun (user_pass, host_port) -> decode_host_port host_port >>= fun (host, port) -> Ok (is_tls, scheme, user_pass, host, port, "/" ^ String.concat "/" path) | [ user_pass_host_port ] -> (match String.split_on_char '@' user_pass_host_port with - | [ host_port ] -> Ok (None, host_port) - | [ user_pass; host_port ] -> - decode_user_pass user_pass >>= fun up -> Ok (Some up, host_port) - | _ -> Error (`Msg "Couldn't decode URI")) + | [ host_port ] -> Ok (None, host_port) + | [ user_pass; host_port ] -> + decode_user_pass user_pass >>= fun up -> Ok (Some up, host_port) + | _ -> Error (`Msg "Couldn't decode URI")) >>= fun (user_pass, host_port) -> decode_host_port host_port >>= fun (host, port) -> Ok (false, "", user_pass, host, port, "/") | user_pass_host_port :: path -> (match String.split_on_char '@' user_pass_host_port with - | [ host_port ] -> Ok (None, host_port) - | [ user_pass; host_port ] -> - decode_user_pass user_pass >>= fun up -> Ok (Some up, host_port) - | _ -> Error (`Msg "Couldn't decode URI")) + | [ host_port ] -> Ok (None, host_port) + | [ user_pass; host_port ] -> + decode_user_pass user_pass >>= fun up -> Ok (Some up, host_port) + | _ -> Error (`Msg "Couldn't decode URI")) >>= fun (user_pass, host_port) -> decode_host_port host_port >>= fun (host, port) -> Ok (false, "", user_pass, host, port, "/" ^ String.concat "/" path) @@ -499,23 +499,22 @@ let single_request cfg ~fn acc = ; epoch } in - begin - match (alpn_protocol flow, cfg.http_config) with - | (Some `HTTP_1_1 | None), Some (`HTTP_1_1 config) -> - single_http_1_1_request ~config flow cfg' ~fn acc - | (Some `HTTP_1_1 | None), None -> single_http_1_1_request flow cfg' ~fn acc - | Some `H2, Some (`H2 config) -> single_h2_request ~config flow cfg' ~fn acc - | None, Some (`H2 _) -> - Log.warn (fun m -> - m "no ALPN protocol (choose http/1.1) where user forces h2"); - single_http_1_1_request flow cfg' ~fn acc - | Some `H2, None -> single_h2_request flow cfg' ~fn acc - | Some `H2, Some (`HTTP_1_1 _) -> - Log.warn (fun m -> m "ALPN protocol is h2 where user forces http/1.1"); - single_h2_request flow cfg' ~fn acc - | Some `HTTP_1_1, Some (`H2 _) -> - Log.warn (fun m -> m "ALPN protocol is http/1.1 where user forces h2"); - single_http_1_1_request flow cfg' ~fn acc + begin match (alpn_protocol flow, cfg.http_config) with + | (Some `HTTP_1_1 | None), Some (`HTTP_1_1 config) -> + single_http_1_1_request ~config flow cfg' ~fn acc + | (Some `HTTP_1_1 | None), None -> single_http_1_1_request flow cfg' ~fn acc + | Some `H2, Some (`H2 config) -> single_h2_request ~config flow cfg' ~fn acc + | None, Some (`H2 _) -> + Log.warn (fun m -> + m "no ALPN protocol (choose http/1.1) where user forces h2"); + single_http_1_1_request flow cfg' ~fn acc + | Some `H2, None -> single_h2_request flow cfg' ~fn acc + | Some `H2, Some (`HTTP_1_1 _) -> + Log.warn (fun m -> m "ALPN protocol is h2 where user forces http/1.1"); + single_h2_request flow cfg' ~fn acc + | Some `HTTP_1_1, Some (`H2 _) -> + Log.warn (fun m -> m "ALPN protocol is http/1.1 where user forces h2"); + single_http_1_1_request flow cfg' ~fn acc end |> open_client_error @@ -621,11 +620,9 @@ let request ?config:http_config ?tls_config ?authenticator ?(meth = `GET) | Some authenticator -> Ok authenticator in Result.map - begin - fun authenticator -> - Tls.Config.client ~alpn_protocols ~authenticator () - |> Result.get_ok - |> fun default -> `Default default + begin fun authenticator -> + Tls.Config.client ~alpn_protocols ~authenticator () |> Result.get_ok + |> fun default -> `Default default end authenticator in dune build @fmt failed "/usr/bin/env" "bash" "-c" "opam exec -- dune build @fmt --ignore-promoted-rules || (echo "dune build @fmt failed"; exit 2)" failed with exit status 2 2025-11-24 17:01.48: Job failed: Failed: Build failed