A batteries included HTTP/1.1 client in OCaml
at main 58 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 Vlog.setup_test ~level:Logs.Debug (); 12 Logs.Src.set_level Conpool.src (Some Logs.Debug); 13 Eio_main.run @@ fun env -> 14 Switch.run @@ fun sw -> 15 traceln "Starting simple server on 127.0.0.1:9000"; 16 17 (* Start a simple echo server *) 18 let raw_bytes = Bytes.create 4 in 19 Bytes.set raw_bytes 0 (Char.chr 127); 20 Bytes.set raw_bytes 1 (Char.chr 0); 21 Bytes.set raw_bytes 2 (Char.chr 0); 22 Bytes.set raw_bytes 3 (Char.chr 1); 23 let ipaddr = Eio.Net.Ipaddr.of_raw (Bytes.to_string raw_bytes) in 24 25 let socket = 26 Eio.Net.listen env#net ~sw ~reuse_addr:true ~backlog:10 27 (`Tcp (ipaddr, 9000)) 28 in 29 30 Eio.Fiber.fork ~sw (fun () -> 31 Eio.Net.accept_fork socket ~sw ~on_error:raise (fun flow _addr -> 32 traceln "Server: accepted connection"; 33 let buf = Eio.Buf_read.of_flow flow ~max_size:1024 in 34 let line = Eio.Buf_read.line buf in 35 traceln "Server: received: %s" line; 36 Eio.Flow.copy_string (line ^ "\n") flow; 37 Eio.Flow.close flow)); 38 39 Eio.Time.sleep env#clock 0.1; 40 41 traceln "Creating connection pool"; 42 let pool = Conpool.basic ~sw ~net:env#net ~clock:env#clock () in 43 44 traceln "Testing connection"; 45 let endpoint = Conpool.Endpoint.v ~host:"127.0.0.1" ~port:9000 in 46 47 let response = 48 Conpool.with_connection pool endpoint (fun conn -> 49 traceln "Client: sending message"; 50 Eio.Flow.copy_string "test message\n" conn.Conpool.flow; 51 let buf = Eio.Buf_read.of_flow conn.Conpool.flow ~max_size:1024 in 52 let resp = Eio.Buf_read.line buf in 53 traceln "Client: received: %s" resp; 54 resp) 55 in 56 57 traceln "Response: %s" response; 58 traceln "Test passed!"