123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404(* This file is part of Dream, released under the MIT license. See LICENSE.md
for details, or visit https://github.com/aantron/dream.
Copyright 2021 Anton Bachin *)moduleCatch=Dream__server.CatchmoduleCipher=Dream__cipher.CiphermoduleCookie=Dream__server.CookiemoduleCsrf=Dream__server.CsrfmoduleEcho=Dream__server.EchomoduleError_handler=Dream__http.Error_handlermoduleFlash=Dream__server.FlashmoduleForm=Dream__server.FormmoduleFormats=Dream_pure.FormatsmoduleGraphql=Dream__graphql.GraphqlmoduleHelpers=Dream__server.HelpersmoduleHttp=Dream__http.HttpmoduleLivereload=Dream__server.LivereloadmoduleMessage=Dream_pure.MessagemoduleMethod=Dream_pure.MethodmoduleOrigin_referrer_check=Dream__server.Origin_referrer_checkmoduleQuery=Dream__server.QuerymoduleRandom=Dream__cipher.RandommoduleRouter=Dream__server.RoutermoduleSite_prefix=Dream__server.Site_prefixmoduleSql=Dream__sql.SqlmoduleSql_session=Dream__sql.SessionmoduleStatic=Dream__unix.StaticmoduleStatus=Dream_pure.StatusmoduleStream=Dream_pure.StreammoduleTag=Dream__server.TagmoduleUpload=Dream__server.Upload(* Initialize clock handling and random number generator. These are
platform-specific, differing between Unix and Mirage. This is the Unix
initialization. *)moduleLog=structincludeDream__server.LogincludeDream__server.Log.Make(Ptime_clock)endletdefault_log=Log.sub_log(Logs.Src.nameLogs.default)let()=Log.initialize~setup_outputs:Fmt_tty.setup_std_outputsletnow()=Ptime.to_float_s(Ptime.v(Ptime_clock.now_d_ps()))let()=Random.initialize(fun()->Mirage_crypto_rng_lwt.initialize(moduleMirage_crypto_rng.Fortuna))moduleSession=structincludeDream__server.SessionincludeDream__server.Session.Make(Ptime_clock)end(* Types *)typerequest=Message.requesttyperesponse=Message.responsetypehandler=Message.handlertypemiddleware=Message.middlewaretyperoute=Router.routetype'amessage='aMessage.messagetypeclient=Message.clienttypeserver=Message.servertype'apromise='aMessage.promise(* Methods *)includeMethod(* Status codes *)includeStatus(* Requests *)letclient=Helpers.clientlettls=Helpers.tlsletmethod_=Message.method_lettarget=Message.targetletprefix=Router.prefixletpath=Router.pathletset_client=Helpers.set_clientletset_method_=Message.set_method_letquery=Query.queryletqueries=Query.queriesletall_queries=Query.all_queries(* Responses *)letresponse=Helpers.response_with_bodyletrespond=Helpers.respondlethtml=Helpers.htmlletjson=Helpers.jsonletredirect=Helpers.redirectletempty=Helpers.emptyletstatus=Message.statusletset_status=Message.set_status(* Headers *)letheader=Message.headerletheaders=Message.headersletall_headers=Message.all_headerslethas_header=Message.has_headerletadd_header=Message.add_headerletdrop_header=Message.drop_headerletset_header=Message.set_header(* Cookies *)letset_cookie=Cookie.set_cookieletdrop_cookie=Cookie.drop_cookieletcookie=Cookie.cookieletall_cookies=Cookie.all_cookies(* Bodies *)letbody=Message.bodyletset_body=Message.set_body(* Streams *)typestream=Stream.streamletbody_stream=Message.server_streamletstream=Helpers.streamletread=Message.readletwrite=Message.writeletflush=Message.flushletclose=Message.closetypebuffer=Stream.bufferletclient_stream=Message.client_streamletserver_stream=Message.server_streamletset_client_stream=Message.set_client_streamletset_server_stream=Message.set_server_streamletread_stream=Stream.readletwrite_stream=Stream.writeletflush_stream=Stream.flushletping_stream=Stream.pingletpong_stream=Stream.pongletclose_stream=Stream.closeletabort_stream=Stream.abort(* WebSockets *)typewebsocket=stream*streamletwebsocket=Helpers.websockettypetext_or_binary=[`Text|`Binary]typeend_of_message=[`End_of_message|`Continues]letsend=Helpers.sendletreceive=Helpers.receiveletreceive_fragment=Helpers.receive_fragmentletclose_websocket=Message.close_websocket(* JSON *)letorigin_referrer_check=Origin_referrer_check.origin_referrer_check(* Forms *)type'aform_result='aForm.form_resultletform=Form.form~nowtypemultipart_form=Upload.multipart_formletmultipart=Upload.multipart~nowtypepart=Upload.partletupload=Upload.uploadletupload_part=Upload.upload_parttypecsrf_result=Csrf.csrf_resultletcsrf_token=Csrf.csrf_token~nowletverify_csrf_token=Csrf.verify_csrf_token~now(* Templates *)letcsrf_tag=Tag.csrf_tag~now(* Middleware *)letno_middleware=Message.no_middlewareletpipeline=Message.pipelineletlivereload=Livereload.livereload(* Routing *)letrouter=Router.routerletget=Router.getletpost=Router.postletput=Router.putletdelete=Router.deletelethead=Router.headletconnect=Router.connectletoptions=Router.optionslettrace=Router.traceletpatch=Router.patchletany=Router.anyletnot_found=Helpers.not_foundletparam=Router.paramletscope=Router.scopeletno_route=Router.no_route(* Static files *)letstatic=Static.staticletfrom_filesystem=Static.from_filesystemletmime_lookup=Static.mime_lookup(* Sessions *)(* TODO Internalize argument order and name changes. *)letsession=Session.sessionletsession_fieldrequestname=sessionnamerequestletput_session=Session.put_sessionletset_session_fieldrequestnamevalue=put_sessionnamevaluerequestletdrop_session_field=Session.drop_session_fieldletall_session_values=Session.all_session_valuesletall_session_fields=all_session_valuesletinvalidate_session=Session.invalidate_sessionletmemory_sessions=Session.memory_sessionsletcookie_sessions=Session.cookie_sessionsletsql_sessions=Sql_session.sql_sessionsletsession_id=Session.session_idletsession_label=Session.session_labelletsession_expires_at=Session.session_expires_at(* Flash messages *)(* TODO Internalize argument order and name changes. *)letflash=Flash.flash_messagesletflash_messages=Flash.flashletadd_flash_message=Flash.put_flash(* GraphQL *)letgraphql=Graphql.graphqlletgraphiql=Graphql.graphiql(* SQL *)letsql_pool=Sql.sql_poolletsql=Sql.sql(* Logging *)letlogger=Log.loggerletlog=Log.convenience_logtype('a,'b)conditional_log=('a,'b)Log.conditional_logtypelog_level=Log.log_levelleterror=default_log.errorletwarning=default_log.warningletinfo=default_log.infoletdebug=default_log.debugtypesub_log=Log.sub_log={error:'a.('a,unit)conditional_log;warning:'a.('a,unit)conditional_log;info:'a.('a,unit)conditional_log;debug:'a.('a,unit)conditional_log;}letsub_log=Log.sub_logletinitialize_log=Log.initialize_logletset_log_level=Log.set_log_level(* Errors *)typeerror=Catch.error={condition:[|`ResponseofMessage.response|`Stringofstring|`Exnofexn];layer:[|`App|`HTTP|`HTTP2|`TLS|`WebSocket];caused_by:[|`Server|`Client];request:Message.requestoption;response:Message.responseoption;client:stringoption;severity:Log.log_level;will_send_response:bool;}typeerror_handler=Catch.error_handlerleterror_template=Error_handler.customizeletdebug_error_handler=Error_handler.debug_error_handlerletcatch=Catch.catch(* Servers *)letrun=Http.runletserve=Http.serveletwith_site_prefix=Site_prefix.with_site_prefix(* Web formats *)includeFormats(* Cryptography *)letset_secret=Cipher.set_secretletrandom=Random.randomletencrypt=Cipher.encryptletdecrypt=Cipher.decrypt(* Custom fields *)type'afield='aMessage.fieldletnew_field=Message.new_fieldletfield=Message.fieldletset_field=Message.set_field(* Testing. *)letrequest=Helpers.request_with_body(* TODO Restore the ability to test with a prefix and re-enable the
corresponding tests. *)lettest?(prefix="")handlerrequest=letapp=Site_prefix.with_site_prefixprefix@@handlerinLwt_main.run(apprequest)letsort_headers=Message.sort_headersletecho=Echo.echo(* Deprecated helpers. *)letwith_pathpathmessage=Router.set_pathmessagepath;message