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

54 lines
1.7 KiB
OCaml

open Core
open Async
open Httpun
open Httpun_async
let main port host () =
let where_to_connect = Tcp.Where_to_connect.of_host_and_port { host; port } in
Tcp.connect_sock where_to_connect
>>= fun socket ->
let finished = Ivar.create () in
let response_handler =
Httpun_examples.Client.print
~on_eof:((Ivar.fill [@alert "-deprecated"]) finished) in
let headers =
Headers.of_list
[ "transfer-encoding", "chunked"
; "connection" , "close"
; "host" , host
]
in
Client.create_connection socket >>= fun connection ->
let request_body =
Client.request
connection
~error_handler:Httpun_examples.Client.error_handler
~response_handler
(Request.create ~headers `POST "/")
in
let stdin = Lazy.force Reader.stdin in
don't_wait_for (
Reader.read_one_chunk_at_a_time stdin ~handle_chunk:(fun bs ~pos:off ~len ->
Body.Writer.write_bigstring request_body bs ~off ~len;
Body.Writer.flush request_body (fun _reason -> ());
return (`Consumed(len, `Need_unknown)))
>>| function
| `Eof_with_unconsumed_data s -> Body.Writer.write_string request_body s;
Body.Writer.close request_body
| `Eof -> Body.Writer.close request_body
| `Stopped () -> assert false);
Ivar.read finished
;;
let () =
Command.async
~summary:"Start a hello world Async client"
Command.Param.(
map (both
(flag "-p" (optional_with_default 80 int)
~doc:"int destination port")
(anon ("host" %: string)))
~f:(fun (port, host) ->
(fun () -> main port host ())))
|> Command_unix.run