123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293openIrky.Common_moduleLog=(valLogs.src_log(Logs.Src.create"irky.unix.ssl"))moduleConfig=structtypet={check_certificate:bool;proto:Ssl.protocol;}letdefault={check_certificate=false;proto=Ssl.TLSv1_3}letshowself:string=spf"{check_certificate=%b; proto=_}"self.check_certificateendletread_blockingsslfdfdbufofflen=letrectry_read()=matchSsl.readsslfdbufofflenwith|n->n|exceptionSsl.Read_errorSsl.Error_want_read->ignore(Unix.select[fd][][](-1.):_*_*_);try_read()intry_read()letrecwrite_sslfdfdbufofflen=matchSsl.writesslfdbufofflenwith|n->n|exceptionSsl.Write_errorSsl.Error_want_write->ignore(Unix.select[][fd][](-1.):_*_*_);write_sslfdfdbufofflenletic_of_fd(sslfd:Ssl.socket)(fd:Unix.file_descr):Iostream.In.t=Unix.set_nonblockfd;letclose()=tryignore(Ssl.close_notifysslfd:bool);Unix.closefdwith_->()inletinputbufofflen=read_blockingsslfdfdbufoffleninIostream.In.create~close~input()letoc_of_fdsslfd(fd:Unix.file_descr):Iostream.Out.t=Unix.set_nonblockfd;objectmethodclose()=tryUnix.closefdwith_->()methodoutputbufofflen=letrecloopofflen=iflen>0then(letn=write_sslfdfdbufoffleninloop(off+n)(len-n))inloopofflenendletconnect~(config:Config.t)~host~port:Iostream.In.t*Iostream.Out.t=(* DNS resolution *)letaddrs=tryletentry=Unix.gethostbynamehostinArray.to_listentry.Unix.h_addr_listwithNot_found->[]inletaddr=matchaddrswith|[]->failwith(Printf.sprintf"Could not resolve %s"host)|addr::_->addrinletssl=Ssl.create_contextconfig.protoSsl.Client_contextinifconfig.check_certificatethen((* from https://github.com/johnelse/ocaml-irc-client/pull/21 *)Ssl.set_verify_depthssl3;Ssl.set_verifyssl[Ssl.Verify_peer](SomeSsl.client_verify_callback);Ssl.set_client_verify_callback_verbosetrue);letsock=Unix.socketUnix.PF_INETUnix.SOCK_STREAM0inletsockaddr=Unix.ADDR_INET(addr,port)inLog.debug(funk->k"Unix.connect socket…");Unix.connectsocksockaddr;Log.debug(funk->k"Ssl.connect socket…");letsslsock=Ssl.embed_socketsocksslinSsl.connectsslsock;ic_of_fdsslsocksock,oc_of_fdsslsocksocklettime=Irky_unix.io.timeletsleep=Irky_unix.io.sleepletwith_timeout=Irky_unix.io.with_timeoutletio~config():Irky.Io.t={connect=connect~config;sleep;time;with_timeout;secure=true}