123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121(*----------------------------------------------------------------------------
* Copyright (c) 2019-2020, António Nuno Monteiro
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*---------------------------------------------------------------------------*)openLwt.InfixmoduleIo:Gluten_lwt.IOwithtypesocket=Lwt_unix.file_descrandtypeaddr=Unix.sockaddr=structtypesocket=Lwt_unix.file_descrtypeaddr=Unix.sockaddrletclosesocket=matchLwt_unix.statesocketwith|Closed->Lwt.return_unit|_->Lwt.catch(fun()->Lwt_unix.closesocket)(fun_exn->Lwt.return_unit)letreadsocketbigstring~off~len=Lwt.catch(fun()->Lwt_bytes.readsocketbigstringofflen>|=function|0->`Eof|n->`Okn)(function|Unix.Unix_error(Unix.EBADF,_,_)->(* If the socket is closed we need to feed EOF to the state machine. *)Lwt.return`Eof|exn->Lwt.async(fun()->closesocket);Lwt.failexn)letwritevsocket=Faraday_lwt_unix.writev_of_fdsocketletshutdownsocketcommand=ifLwt_unix.statesocket<>Lwt_unix.ClosedthentryLwt_unix.shutdownsocketcommandwith|Unix.Unix_error(Unix.ENOTCONN,_,_)->()letshutdown_sendsocket=shutdownsocketUnix.SHUTDOWN_SENDletshutdown_receivesocket=shutdownsocketUnix.SHUTDOWN_RECEIVEletstatesocket=matchLwt_unix.statesocketwith|Aborted_->`Error|Closed->`Closed|Opened->`OpenendmoduleServer=structincludeGluten_lwt.Server(Io)moduleTLS=structincludeGluten_lwt.Server(Tls_io.Io)letcreate_default~certfile~keyfile=letmake_tls_server=Tls_io.make_server~certfile~keyfileinfun_client_addrsocket->make_tls_serversocketendmoduleSSL=structincludeGluten_lwt.Server(Ssl_io.Io)letcreate_default~certfile~keyfile=letmake_ssl_server=Ssl_io.make_server~certfile~keyfileinfun_client_addrsocket->make_ssl_serversocketendendmoduleClient=structincludeGluten_lwt.Client(Io)moduleTLS=structincludeGluten_lwt.Client(Tls_io.Io)letcreate_defaultsocket=Tls_io.make_clientsocketendmoduleSSL=structincludeGluten_lwt.Client(Ssl_io.Io)letcreate_defaultsocket=Ssl_io.make_default_clientsocketendend