open Cmdliner let run port = Eio_main.run @@ fun env -> Eio.Switch.run @@ fun sw -> let net = Eio.Stdenv.net env in let addr = `Tcp (Eio.Net.Ipaddr.V4.loopback, port) in let server_socket = Eio.Net.listen net ~backlog:10 ~reuse_addr:true ~sw addr in Eio.traceln "FastCGI server listening on port %d" port; Eio.Net.run_server server_socket ~on_error:(fun ex -> Eio.traceln "Error: %s" (Printexc.to_string ex)) @@ fun flow addr -> Eio.traceln "Accepted connection from %a" Eio.Net.Sockaddr.pp addr; (* Here you would handle the FastCGI protocol, but for simplicity, we just echo a string. *) let req = Fastcgi.Request.read_request_from_flow ~sw flow in match req with | Error msg -> Eio.traceln "Failed to read request: %s" msg; Eio.Flow.close flow | Ok req -> Eio.traceln "Received request: %a" Fastcgi.Request.pp req; Eio.Flow.close flow let port = let doc = "Port to listen on" in Arg.(value & opt int 9000 & info ["p"; "port"] ~docv:"PORT" ~doc) let cmd = let doc = "FastCGI server" in let info = Cmd.info "fcgi-server" ~doc in Cmd.v info Term.(const run $ port) let () = exit (Cmd.eval cmd)