mte/unikernel/duniverse/ocaml-h2/examples/lwt/lwt_get.ml
2025-11-11 02:07:51 +01:00

61 lines
1.8 KiB
OCaml

open H2
module Client = H2_lwt_unix.Client
let response_handler notify_response_received _response response_body =
let rec read_response () =
Body.Reader.schedule_read
response_body
~on_eof:(fun () -> Lwt.wakeup_later notify_response_received ())
~on_read:(fun bigstring ~off ~len ->
let response_fragment = Bytes.create len in
Bigstringaf.blit_to_bytes
bigstring
~src_off:off
response_fragment
~dst_off:0
~len;
print_string (Bytes.to_string response_fragment);
read_response ())
in
read_response ()
let error_handler _ = assert false
open Lwt.Infix
let () =
let host = ref None in
let port = ref 443 in
Arg.parse
[ "-p", Set_int port, " Port number (443 by default)" ]
(fun host_argument -> host := Some host_argument)
"lwt_get.exe [-p N] HOST";
let host =
match !host with
| None -> failwith "No hostname provided"
| Some host -> host
in
Lwt_main.run
( Lwt_unix.getaddrinfo
host
(string_of_int !port)
[ Unix.(AI_FAMILY PF_INET) ]
>>= fun addresses ->
let socket = Lwt_unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 in
Lwt_unix.connect socket (List.hd addresses).Unix.ai_addr >>= fun () ->
let request =
Request.create
`GET
"/"
~scheme:"https"
~headers:Headers.(add_list empty [ ":authority", host ])
in
let response_received, notify_response_received = Lwt.wait () in
let response_handler = response_handler notify_response_received in
Client.SSL.create_connection_with_default ~error_handler socket
>>= fun connection ->
let request_body =
Client.SSL.request connection request ~error_handler ~response_handler
in
Body.Writer.close request_body;
response_received )