mte/unikernel/duniverse/httpun/examples/async/async_https_get.ml
2025-11-11 02:07:51 +01:00

50 lines
1.4 KiB
OCaml

open Core
open Async
open Httpun
open Httpun_async
let response_handler finished response response_body =
match response with
| { Response.status = `OK; _ } ->
let rec on_read bs ~off ~len =
Bigstring.to_string ~pos:off ~len bs |> print_endline;
Body.Reader.schedule_read response_body ~on_read ~on_eof
and on_eof () = (Ivar.fill [@ocaml.alert "-deprecated"]) finished () in
Body.Reader.schedule_read response_body ~on_read ~on_eof;
| response ->
Format.fprintf Format.std_formatter "%a\n%!" Response.pp_hum response;
Core.exit 1
;;
let error_handler _ = assert false
let main port host () =
let where_to_connect = Tcp.Where_to_connect.of_host_and_port { host; port } in
let finished = Ivar.create () in
Tcp.connect_sock where_to_connect
>>= fun socket ->
Client.SSL.create_connection_with_default socket >>= fun conn ->
let headers = Headers.of_list [ "host", host ] in
let request_body =
Client.SSL.request
~error_handler
~response_handler:(response_handler finished)
conn
(Request.create ~headers `GET "/")
in
Body.Writer.close request_body;
Ivar.read finished
;;
let () =
Command.async_spec
~summary:"Start a hello world Async server"
Command.Spec.(empty +>
flag "-p" (optional_with_default 443 int)
~doc:"int destination port"
+>
flag "-h" (required string)
~doc:"string destination host"
) main
|> Command_unix.run