123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295# 1 "src/lib/eliom_registration.client.ml"(* Ocsigen
* http://www.ocsigen.org
* Copyright (C) 2016 Vasilis Papavasileiou
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, with linking exception;
* either version 2.1 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*)letsection=Lwt_log_js.Section.make"eliom:registration"moduletypeBase=sigtypereturn=Eliom_service.non_ocamlendmoduleBase=structtypereturn=Eliom_service.non_ocamlendmoduleBlock5=BasemoduleHtml_text=BasemoduleCssText=BasemoduleText=BasemoduleString_redirection=BasemoduleStreamlist=BasemoduleOcaml=structtype'areturn='aEliom_service.ocamlendtype'akind=Eliom_service.resulttypebrowser_content=[`Browser]type'aapplication_content=[`Applof'a]moduletypePARAM=sigtypepagetypeoptionstypereturntyperesultvalreset_reload_fun:boolvalsend:?options:options->page->[`Browser]kindLwt.tendlettyped_apply~servicefgpppll'suffix=try%lwtlet%lwtg=letl=Some(Lwt.returnl)inEliom_parameter.reconstruct_params~sp:()gplNonetruesuffixandp=letl'=Some(Lwt.returnl')inEliom_parameter.reconstruct_params~sp:()ppl'Nonetruesuffixin(matchEliom_service.reload_funservicewith|Some_->Eliom_client.set_reload_function(fun()()->fgp)|None->());fgpwithEliom_common.Eliom_Wrong_parameter->Lwt.failEliom_common.Eliom_Wrong_parameterletwrapserviceattf_suffix=letgp=Eliom_service.get_params_typeserviceandpp=Eliom_service.post_params_typeserviceandl=(Eliom_request_info.get_sess_info()).si_all_get_but_nlandl'=match(Eliom_request_info.get_sess_info()).si_all_post_paramswith|Somel->l|None->[]inmatchEliom_service.get_nameattwith|Eliom_common.SAtt_nameds|Eliom_common.SAtt_anons->(tryleteliom_name=List.assoc"__eliom__"landl=List.remove_assoc"__eliom__"landl'=List.remove_assoc"__eliom__"l'inifeliom_name=sthentyped_apply~servicefgpppll'suffixelseLwt.failEliom_common.Eliom_Wrong_parameterwithNot_found->Lwt.failEliom_common.Eliom_Wrong_parameter)|_->typed_apply~servicefgpppll'suffixletwrap_na(service:(_,_,_,_,_,_,_,_,_,_,_)Eliom_service.t)_non_attf_suffix=letgp=Eliom_service.get_params_typeserviceandpp=Eliom_service.post_params_typeserviceandsi=Eliom_request_info.get_sess_info()andfilterl=fstEliom_common.(split_prefix_paramna_co_param_prefixl)inletl=filtersi.si_all_get_but_nlandl'=matchsi.si_all_post_paramswithSomel->filterl|None->[]intyped_apply~servicefgpppll'suffixletregister_att~service~attf=letkey_meth=Eliom_service.which_meth_untypedserviceandgn=Eliom_service.get_nameattandpn=Eliom_service.post_nameattandpriority=Eliom_service.priorityattinletsgpt=Eliom_service.get_params_typeserviceandsppt=Eliom_service.post_params_typeservicein(matchEliom_service.timeoutservicewith|None->()|Some_->Lwt_log_js.ign_info~section"Service timeout ignored on the client");lets_id=ifgn=Eliom_common.SAtt_no||pn=Eliom_common.SAtt_nothenEliom_parameter.(anonymise_params_typesgpt,anonymise_params_typesppt)else0,0ands_max_use=Eliom_service.max_useserviceands_expire=Noneands_f=wrapserviceattfinEliom_route.add_servicepriorityEliom_route.global_tables(Eliom_service.sub_pathatt){Eliom_common.key_state=gn,pn;Eliom_common.key_meth:>Eliom_common.meth}{s_id;s_max_use;s_expire;s_f}letregister_na~service~naf=Eliom_route.add_naserviceEliom_service.(na_namena)(wrap_naservicenaf)Eliom_route.global_tablesletregister(typegpatt)~(service:(g,p,_,att,_,_,_,_,_,_,_)Eliom_service.t)(f:g->p->_)=matchEliom_service.infoservicewith|Eliom_service.Attachedatt->register_att~service~attf|Eliom_service.Nonattachedna->register_na~service~nafmoduleMake(P:PARAM)=structtypepage=P.pagetypeoptions=P.optionstypereturn=P.returntyperesult=P.resultletsend?options?charset:_?code:_?content_type:_?headers:_page=P.send?optionspageletregister?app?scope:_?options?charset:_?code:_?content_type:_?headers:_?secure_session:_(typegpatt)~(service:(g,p,_,att,_,_,_,_,_,_,_)Eliom_service.t)?error_handler:_(f:g->p->_)=letfgp=let%lwtpage=fgpinP.send?optionspageinregister~servicef;Eliom_service.set_client_fun?app~servicef;ifP.reset_reload_funthenEliom_service.reset_reload_funserviceendmoduleHtml=Make(structtypepage=Html_types.htmlEliom_content.Html.elttypeoptions=unittypereturn=Eliom_service.non_ocamltyperesult=browser_contentkindletreset_reload_fun=falseletsend?options:_page=Lwt.return(Eliom_service.Dom(Eliom_content.Html.To_dom.of_elementpage))end)moduleAction=Make(structtypepage=unittypeoptions=[`Reload|`NoReload]typereturn=Eliom_service.non_ocamltyperesult=browser_contentkindletreset_reload_fun=trueletsend?options_page=matchoptionswith|Some`Reload|None->Lwt.returnEliom_service.(Reload_action{hidden=false;https=false})|_->Lwt.returnEliom_service.No_contentsend)moduleUnit=Make(structtypepage=unittypeoptions=unittypereturn=Eliom_service.non_ocamltyperesult=browser_contentkindletreset_reload_fun=trueletsend?options:__page=Lwt.returnEliom_service.No_contentsend)typeappl_service_options={do_not_launch:bool}moduleApp(P:Eliom_registration_sigs.APP_PARAM)=structtypeapp_idletapplication_name=P.application_nameincludeMake(structtypepage=Html_types.htmlEliom_content.Html.elttypeoptions=appl_service_optionstypereturn=Eliom_service.non_ocamltyperesult=browser_contentkindletreset_reload_fun=falseletsend?options:_page=Lwt.return(Eliom_service.Dom(Eliom_content.Html.To_dom.of_elementpage))end)endtype'aredirection=|Redirection:(unit,unit,Eliom_service.get,_,_,_,_,[`WithoutSuffix],unit,unit,'a)Eliom_service.t->'aredirectionmoduleRedirection=struct(* not really polymorphic; just adding a type variable to maintain
type-level compatibility with server (for injections) *)type_page=Eliom_service.non_ocamlredirectiontypeoptions=[`MovedPermanently|`Found|`SeeOther|`NotNodifed|`UseProxy|`TemporaryRedirect]type_return=Eliom_service.non_ocamltype_result=browser_contentkindletsend?options:_?charset:_?code:_?content_type:_?headers:_(Redirectionservice)=Lwt.return(Eliom_service.Redirectservice)letregister?app?scope:_?options?charset:_?code:_?content_type:_?headers:_?secure_session:_(typegpatt)~(service:(g,p,_,att,_,_,_,_,_,_,_)Eliom_service.t)?error_handler:_(f:g->p->_)=letfgp=let%lwtpage=fgpinsend?optionspageinregister~servicef;Eliom_service.set_client_fun?app~servicefendmoduleAny=structtype'apage='akindtype'areturn=Eliom_service.non_ocamltype'aresult='akindtypeoptions=unitletsend?options:_?charset:_?code:_?content_type:_?headers:_page=Lwt.returnpageletregister?app?scope:_?options:_?charset:_?code:_?content_type:_?headers:_?secure_session:_~service?error_handler:_f=letfgp=let%lwtpage=fgpinsendpageinregister~servicef;Eliom_service.set_client_fun?app~servicefendletappl_self_redirectfx=fxmoduleString=Base