A batteries included HTTP/1.1 client in OCaml
1(*---------------------------------------------------------------------------
2 Copyright (c) 2025 Anil Madhavapeddy <anil@recoil.org>. All rights reserved.
3 SPDX-License-Identifier: ISC
4 ---------------------------------------------------------------------------*)
5
6(* Simple test to debug connection issues *)
7
8open Eio.Std
9
10let () =
11 Logs.set_reporter (Logs_fmt.reporter ());
12 Logs.set_level (Some Logs.Debug);
13 Logs.Src.set_level Conpool.src (Some Logs.Debug);
14
15 Eio_main.run @@ fun env ->
16 Switch.run @@ fun sw ->
17
18 traceln "Starting simple server on 127.0.0.1:9000";
19
20 (* Start a simple echo server *)
21 let raw_bytes = Bytes.create 4 in
22 Bytes.set raw_bytes 0 (Char.chr 127);
23 Bytes.set raw_bytes 1 (Char.chr 0);
24 Bytes.set raw_bytes 2 (Char.chr 0);
25 Bytes.set raw_bytes 3 (Char.chr 1);
26 let ipaddr = Eio.Net.Ipaddr.of_raw (Bytes.to_string raw_bytes) in
27
28 let socket = Eio.Net.listen env#net ~sw ~reuse_addr:true ~backlog:10
29 (`Tcp (ipaddr, 9000))
30 in
31
32 Eio.Fiber.fork ~sw (fun () ->
33 Eio.Net.accept_fork socket ~sw ~on_error:raise (fun flow _addr ->
34 traceln "Server: accepted connection";
35 let buf = Eio.Buf_read.of_flow flow ~max_size:1024 in
36 let line = Eio.Buf_read.line buf in
37 traceln "Server: received: %s" line;
38 Eio.Flow.copy_string (line ^ "\n") flow;
39 Eio.Flow.close flow
40 )
41 );
42
43 Eio.Time.sleep env#clock 0.1;
44
45 traceln "Creating connection pool";
46 let pool = Conpool.create ~sw ~net:env#net ~clock:env#clock () in
47
48 traceln "Testing connection";
49 let endpoint = Conpool.Endpoint.make ~host:"127.0.0.1" ~port:9000 in
50
51 let response = Conpool.with_connection pool endpoint (fun flow ->
52 traceln "Client: sending message";
53 Eio.Flow.copy_string "test message\n" flow;
54 let buf = Eio.Buf_read.of_flow flow ~max_size:1024 in
55 let resp = Eio.Buf_read.line buf in
56 traceln "Client: received: %s" resp;
57 resp
58 ) in
59
60 traceln "Response: %s" response;
61 traceln "Test passed!"