Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file client.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163openBaseopenAsync_kernelopenAsync_unixmoduleRequest=structincludeCohttp.Requestinclude(Make(Io):moduletypeofMake(Io)withtypet:=t)endmoduleResponse=structincludeCohttp.Responseinclude(Make(Io):moduletypeofMake(Io)withtypet:=t)endmoduleNet=structletlookupuri=lethost=Option.value(Uri.hosturi)~default:"localhost"inmatchUri_services.tcp_port_of_uri~default:"http"uriwith|None->Deferred.Or_error.error_string"Net.lookup: failed to get TCP port form Uri"|Someport->letopenUnixinAddr_info.get~host[Addr_info.AI_FAMILYPF_INET;Addr_info.AI_SOCKTYPESOCK_STREAM]>>|function|{Addr_info.ai_addr=ADDR_INET(addr,_);_}::_->Or_error.return(host,Ipaddr_unix.of_inet_addraddr,port)|_->Or_error.error"Failed to resolve Uri"uriUri_sexp.sexp_of_tletconnect_uri?interrupt?ssl_configuri=lookupuri|>Deferred.Or_error.ok_exn>>=fun(host,addr,port)->letmode=match(Uri.schemeuri,ssl_config)with|Some"https",Someconfig->`OpenSSL(addr,port,config)|Some"https",None->letconfig=Conduit_async.V2.Ssl.Config.create~hostname:host()in`OpenSSL(addr,port,config)|Some"httpunix",_->`Unix_domain_sockethost|_->`TCP(addr,port)inConduit_async.V2.connect?interruptmodeendletread_requestic=Response.readic>>|function|`Eof->failwith"Connection closed by remote host"|`Invalidreason->failwithreason|`Okres->(* Build a response pipe for the body *)letreader=Response.make_body_readerresicinletpipe=Body_raw.pipe_of_bodyResponse.read_body_chunkreaderin(res,pipe)letrequest?interrupt?ssl_config?uri?(body=`Empty)req=(* Connect to the remote side *)leturi=matchuriwith|Somet->t|None->Request.urireqinNet.connect_uri?interrupt?ssl_configuri>>=fun(ic,oc)->try_with(fun()->Request.write(funwriter->Body_raw.write_bodyRequest.write_bodybodywriter)reqoc>>=fun()->read_requestic>>|fun(resp,body)->don't_wait_for(Pipe.closedbody>>=fun()->Deferred.all_unit[Reader.closeic;Writer.closeoc]);(resp,`Pipebody))>>=beginfunction|Okres->returnres|Errore->don't_wait_for(Reader.closeic);don't_wait_for(Writer.closeoc);raiseeendletcallv?interrupt?ssl_configurireqs=letreqs_c=ref0inletresp_c=ref0inNet.connect_uri?interrupt?ssl_configuri>>=fun(ic,oc)->try_with(fun()->reqs|>Pipe.iter~f:(fun(req,body)->Int.incrreqs_c;Request.write(funw->Body_raw.write_bodyRequest.write_bodybodyw)reqoc)|>don't_wait_for;letlast_body_drained=refDeferred.unitinletresponses=Reader.read_allic(funic->!last_body_drained>>=fun()->ifPipe.is_closedreqs&&(!resp_c>=!reqs_c)thenreturn`Eofelseic|>read_request>>|fun(resp,body)->Int.incrresp_c;last_body_drained:=Pipe.closedbody;`Ok(resp,`Pipebody))indon't_wait_for(Pipe.closedreqs>>=fun()->Pipe.closedresponses>>=fun()->Writer.closeoc);returnresponses)>>=beginfunction|Okx->returnx|Errore->don't_wait_for(Reader.closeic);don't_wait_for(Writer.closeoc);raiseeendletcall?interrupt?ssl_config?headers?(chunked=false)?(body=`Empty)methuri=(* Create a request, then make the request. Figure out an appropriate
transfer encoding *)letreq=matchchunkedwith|false->Body_raw.disable_chunked_encodingbody>>|fun(_body,body_length)->Request.make_for_client?headers~chunked~body_lengthmethuri|true->beginBody.is_emptybody>>|function|true->(* Don't used chunked encoding with an empty body *)Request.make_for_client?headers~chunked:false~body_length:0Lmethuri|false->(* Use chunked encoding if there is a body *)Request.make_for_client?headers~chunked:truemethuriendinreq>>=request?interrupt?ssl_config~body~uriletget?interrupt?ssl_config?headersuri=call?interrupt?ssl_config?headers~chunked:false`GETurilethead?interrupt?ssl_config?headersuri=call?interrupt?ssl_config?headers~chunked:false`HEADuri>>|fun(res,body)->(matchbodywith|`Pipep->Pipe.close_readp;|_->());resletpost?interrupt?ssl_config?headers?(chunked=false)?bodyuri=call?interrupt?ssl_config?headers~chunked?body`POSTuriletpost_form?interrupt?ssl_config?headers~paramsuri=letheaders=Cohttp.Header.add_opt_unless_existsheaders"content-type""application/x-www-form-urlencoded"inletbody=Body.of_string(Uri.encoded_of_queryparams)inpost?interrupt?ssl_config~headers~chunked:false~bodyuriletput?interrupt?ssl_config?headers?(chunked=false)?bodyuri=call?interrupt?ssl_config?headers~chunked?body`PUTuriletpatch?interrupt?ssl_config?headers?(chunked=false)?bodyuri=call?interrupt?ssl_config?headers~chunked?body`PATCHuriletdelete?interrupt?ssl_config?headers?(chunked=false)?bodyuri=call?interrupt?ssl_config?headers~chunked?body`DELETEuri