A batteries included HTTP/1.1 client in OCaml
at claude-test 61 lines 2.0 kB view raw
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!"