Skip to content

Commit

Permalink
Add configuration options to instruction
Browse files Browse the repository at this point in the history
  • Loading branch information
balat committed May 8, 2024
1 parent 9cdc739 commit 69197bc
Show file tree
Hide file tree
Showing 7 changed files with 466 additions and 48 deletions.
2 changes: 1 addition & 1 deletion src/lib/eliom.server.ml
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
let run ?site () =
Ocsigen_server.Site.register ?site Eliom_registration.instruction
Ocsigen_server.Site.register ?site (Eliom_registration.instruction ())
72 changes: 72 additions & 0 deletions src/lib/eliom_config.server.ml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,78 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*)
let set_session_gc_frequency t =
let t = Option.map float_of_int t in
Eliommod_gc.set_servicesessiongcfrequency t;
Eliommod_gc.set_datasessiongcfrequency t

let set_service_session_gc_frequency t =
let t = Option.map float_of_int t in
Eliommod_gc.set_servicesessiongcfrequency t

let set_data_session_gc_frequency t =
let t = Option.map float_of_int t in
Eliommod_gc.set_datasessiongcfrequency t

let set_persistent_session_gc_frequency t =
let t = Option.map float_of_int t in
Eliommod_gc.set_persistentsessiongcfrequency t

let set_volatile_timeout ?scope_hierarchy ~cookie_level v =
let v = Option.map float_of_int v in
Eliommod_timeouts.set_default ?scope_hierarchy `Data cookie_level v;
Eliommod_timeouts.set_default ?scope_hierarchy `Service cookie_level v

let set_data_timeout ?scope_hierarchy ~cookie_level v =
let v = Option.map float_of_int v in
Eliommod_timeouts.set_default ?scope_hierarchy `Data cookie_level v

let set_service_timeout ?scope_hierarchy ~cookie_level v =
let v = Option.map float_of_int v in
Eliommod_timeouts.set_default ?scope_hierarchy `Service cookie_level v

let set_persistent_timeout ?scope_hierarchy ~cookie_level v =
let v = Option.map float_of_int v in
Eliommod_timeouts.set_default ?scope_hierarchy `Persistent cookie_level v

let set_max_service_sessions_per_group v =
Eliommod.default_max_service_sessions_per_group := v

let set_max_volatile_data_sessions_per_group v =
Eliommod.default_max_volatile_data_sessions_per_group := v

let set_max_persistent_data_sessions_per_group v =
Eliommod.default_max_persistent_data_sessions_per_group := v

let set_max_service_tab_sessions_per_group v =
Eliommod.default_max_service_tab_sessions_per_group := v

let set_max_volatile_data_tab_sessions_per_group v =
Eliommod.default_max_volatile_data_tab_sessions_per_group := v

let set_max_persistent_data_tab_sessions_per_group v =
Eliommod.default_max_persistent_data_tab_sessions_per_group := v

let set_max_anonymous_services_per_session v =
Eliommod.default_max_anonymous_services_per_session := v

let set_max_volatile_groups_per_site v =
Eliommod.default_max_volatile_groups_per_site := v

let set_secure_cookies v = Eliommod.default_secure_cookies := v
let set_application_script v = Eliommod.default_application_script := v
let set_cache_global_data v = Eliommod.default_cache_global_data := v
let set_html_content_type v = Eliommod.default_html_content_type := Some v

let add_ignored_get_params regexp =
Eliommod.default_ignored_get_params :=
regexp :: !Eliommod.default_ignored_get_params

let add_ignored_post_params regexp =
Eliommod.default_ignored_post_params :=
regexp :: !Eliommod.default_ignored_post_params

let set_omitpersistentstorage v = Eliommod.default_omitpersistentstorage := v

let get_default_hostname () =
let sitedata = Eliom_request_info.find_sitedata "get_default_hostname" in
Expand Down
69 changes: 65 additions & 4 deletions src/lib/eliom_config.server.mli
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,76 @@ v}
*)

val set_session_gc_frequency : int option -> unit
(** Set frequency
for garnage collection of both in memory data and service sessions.
[None] means never. *)

val set_service_session_gc_frequency : int option -> unit
(** Set frequency for garbage collection of service sessions.
[None] means never. *)

val set_data_session_gc_frequency : int option -> unit
(** Set frequency for garbage collection of in memory data sessions.
[None] means never. *)

val set_persistent_session_gc_frequency : int option -> unit
(** Set frequency for garbage collection of persistent data sessions.
[None] means never. *)

val set_volatile_timeout :
?scope_hierarchy:Eliom_common.scope_hierarchy
-> cookie_level:[< `Session | `Client_process]
-> int option
-> unit

val set_data_timeout :
?scope_hierarchy:Eliom_common.scope_hierarchy
-> cookie_level:[< `Session | `Client_process]
-> int option
-> unit

val set_service_timeout :
?scope_hierarchy:Eliom_common.scope_hierarchy
-> cookie_level:[< `Session | `Client_process]
-> int option
-> unit

val set_persistent_timeout :
?scope_hierarchy:Eliom_common.scope_hierarchy
-> cookie_level:[< `Session | `Client_process]
-> int option
-> unit

val set_max_service_sessions_per_group : int -> unit
val set_max_volatile_data_sessions_per_group : int -> unit
val set_max_persistent_data_sessions_per_group : int -> unit
val set_max_service_tab_sessions_per_group : int -> unit
val set_max_volatile_data_tab_sessions_per_group : int -> unit
val set_max_persistent_data_tab_sessions_per_group : int -> unit
val set_max_anonymous_services_per_session : int -> unit
val set_max_volatile_groups_per_site : int -> unit
val set_secure_cookies : bool -> unit
val set_application_script : bool * bool -> unit
val set_cache_global_data : (Eliom_lib.Url.path * int) option -> unit
val set_html_content_type : string -> unit
val add_ignored_get_params : string * Re.re -> unit
val add_ignored_post_params : string * Re.re -> unit

val set_omitpersistentstorage :
Eliom_common.omitpersistentstorage_rule list option
-> unit

val get_default_hostname : unit -> string
(** The function [get_default_hostname ()]returns the hostname
declared in the config file ([<host defaulthostname="...">]) or
the default machine hostname.
In that case, absolute URL will use that hostname. *)
declared in the config file ([<host defaulthostname="...">]) or
the default machine hostname.
In that case, absolute URL will use that hostname. *)

val get_default_port : unit -> int
(** The function [get_default_port ()] returns the port number
declared in the config file ([<host defaulthttpport="...">]) or
declared in the config file ([<host defaulthttpport="...">]) or
-> unit
80 if undeclared.
*)

Expand Down
69 changes: 68 additions & 1 deletion src/lib/eliom_registration.server.ml
Original file line number Diff line number Diff line change
Expand Up @@ -1261,8 +1261,75 @@ let set_exn_handler h =
Eliom_request_info.set_site_handler sitedata
(Result_types.cast_function_http h)

let instruction vh conf_info site_dir =
let instruction ?xhr_links ?data_timeout ?service_timeout ?persistent_timeout
?max_service_sessions_per_group ?max_volatile_data_sessions_per_group
?max_persistent_data_sessions_per_group ?max_service_tab_sessions_per_group
?max_volatile_data_tab_sessions_per_group
?max_persistent_data_tab_sessions_per_group
?max_anonymous_services_per_session ?secure_cookies ?application_script
?global_data_caching ?html_content_type ?ignored_get_params
?ignored_post_params ?omitpersistentstorage () vh conf_info site_dir
=
let sitedata = Eliommod.create_sitedata vh site_dir conf_info in
(* customize sitedata according to optional parameters: *)
Option.iter
(fun v ->
sitedata.Eliom_common.default_links_xhr#set ~override_tenable:true v)
xhr_links;
Option.iter
(fun (level, hierarchyname, v) ->
Eliommod.set_timeout
(Eliommod_timeouts.set_global_ ~kind:`Data)
sitedata level hierarchyname v)
data_timeout;
Option.iter
(fun (level, hierarchyname, v) ->
Eliommod.set_timeout
(Eliommod_timeouts.set_global_ ~kind:`Service)
sitedata level hierarchyname v)
service_timeout;
Option.iter
(fun (level, hierarchyname, v) ->
Eliommod.set_timeout
(Eliommod_timeouts.set_global_ ~kind:`Persistent)
sitedata level hierarchyname v)
persistent_timeout;
Option.iter
(fun v -> sitedata.max_service_sessions_per_group <- v)
max_service_sessions_per_group;
Option.iter
(fun v -> sitedata.max_volatile_data_sessions_per_group <- v)
max_volatile_data_sessions_per_group;
Option.iter
(fun v -> sitedata.max_persistent_data_sessions_per_group <- Some v, true)
max_persistent_data_sessions_per_group;
Option.iter
(fun v -> sitedata.max_service_tab_sessions_per_group <- v)
max_service_tab_sessions_per_group;
Option.iter
(fun v -> sitedata.max_volatile_data_tab_sessions_per_group <- v)
max_volatile_data_tab_sessions_per_group;
Option.iter
(fun v ->
sitedata.max_persistent_data_tab_sessions_per_group <- Some v, true)
max_persistent_data_tab_sessions_per_group;
Option.iter
(fun v -> sitedata.max_anonymous_services_per_session <- v)
max_anonymous_services_per_session;
Option.iter (fun v -> sitedata.secure_cookies <- v) secure_cookies;
Option.iter (fun v -> sitedata.application_script <- v) application_script;
Option.iter (fun v -> sitedata.cache_global_data <- v) global_data_caching;
Option.iter (fun v -> sitedata.html_content_type <- Some v) html_content_type;
Option.iter
(fun v -> sitedata.ignored_get_params <- v :: sitedata.ignored_get_params)
ignored_get_params;
Option.iter
(fun v -> sitedata.ignored_post_params <- v :: sitedata.ignored_post_params)
ignored_post_params;
Option.iter
(fun v -> sitedata.omitpersistentstorage <- v)
omitpersistentstorage;
(* end sitedata *)
Eliom_common.absolute_change_sitedata sitedata;
(* CHECKME *)
Eliom_common.begin_load_eliom_module ();
Expand Down
32 changes: 31 additions & 1 deletion src/lib/eliom_registration.server.mli
Original file line number Diff line number Diff line change
Expand Up @@ -488,5 +488,35 @@ val cast_http_result : Ocsigen_response.t -> 'a kind
(** [cast_http_result] should only be used to register new output
modules *)

val instruction : Ocsigen_server.Site.instruction
val instruction :
?xhr_links:bool
-> ?data_timeout:
[< Eliom_common.cookie_level]
* Eliom_common_base.scope_hierarchy option
* float option
-> ?service_timeout:
[< Eliom_common.cookie_level]
* Eliom_common_base.scope_hierarchy option
* float option
-> ?persistent_timeout:
[< Eliom_common.cookie_level]
* Eliom_common_base.scope_hierarchy option
* float option
-> ?max_service_sessions_per_group:int * bool
-> ?max_volatile_data_sessions_per_group:int * bool
-> ?max_persistent_data_sessions_per_group:int
-> ?max_service_tab_sessions_per_group:int * bool
-> ?max_volatile_data_tab_sessions_per_group:int * bool
-> ?max_persistent_data_tab_sessions_per_group:int
-> ?max_anonymous_services_per_session:int * bool
-> ?secure_cookies:bool
-> ?application_script:bool * bool
-> ?global_data_caching:(string list * int) option
-> ?html_content_type:string
-> ?ignored_get_params:string * Re.re
-> ?ignored_post_params:string * Re.re
-> ?omitpersistentstorage:Eliom_common.omitpersistentstorage_rule list option
-> unit
-> Ocsigen_server.Site.instruction

val end_init : unit -> unit
86 changes: 45 additions & 41 deletions src/lib/server/eliommod.ml
Original file line number Diff line number Diff line change
Expand Up @@ -608,18 +608,18 @@ let end_init () =
if !exception_during_eliommodule_loading
then
(* An eliom module failed with an exception. We do not check
for the missing services, so that the exception can be correctly
propagated by Ocsigen_extensions *)
for the missing services, so that the exception can be correctly
propagated by Ocsigen_extensions *)
()
else
try
Eliom_common.verify_all_registered (Eliom_common.get_current_sitedata ());
Eliom_common.end_current_sitedata ()
with Eliom_common.Eliom_site_information_not_available _ -> ()
(*VVV The "try with" looks like a hack:
end_init is called even for user config files ... but in that case,
current_sitedata is not set ...
It would be better to avoid calling end_init for user config files. *)
end_init is called even for user config files ... but in that case,
current_sitedata is not set ...
It would be better to avoid calling end_init for user config files. *)

(** Function that will handle exceptions during the initialisation phase *)
let handle_init_exn = function
Expand Down Expand Up @@ -739,6 +739,37 @@ let gen_nothing () _ = Lwt.return Ocsigen_extensions.Ext_do_nothing
(*****************************************************************************)
let default_module_action _ = failwith "default_module_action"

let set_timeout
(f :
?full_st_name:Eliom_common.full_state_name
-> ?cookie_level:[< Eliom_common.cookie_level]
-> recompute_expdates:bool
-> bool (* override configfile *)
-> bool (* from config file *)
-> Eliom_common.sitedata
-> float option
-> unit) sitedata cookie_type state_hier v
=
let make_full_st_name secure state_hier =
let scope =
match cookie_type with
| `Session -> `Session state_hier
| `Client_process -> `Client_process state_hier
in
Eliom_common.make_full_state_name2 sitedata.Eliom_common.site_dir_string
secure ~scope
in
(*VVV We set timeout for both secure and unsecure states.
Make possible to customize this? *)
f
?full_st_name:(Option.map (make_full_st_name false) state_hier)
?cookie_level:(Some cookie_type) ~recompute_expdates:false true true
sitedata v;
f
?full_st_name:(Option.map (make_full_st_name true) state_hier)
?cookie_level:(Some cookie_type) ~recompute_expdates:false true true
sitedata v

(** Parsing of config file for each site: *)
let parse_config _ hostpattern conf_info site_dir =
(*--- if we put the following line here: *)
Expand Down Expand Up @@ -814,50 +845,23 @@ let parse_config _ hostpattern conf_info site_dir =
browsers manage cookies (one cookie for one site).
Thus we can have one site in several cmo (with one session).
*)
let set_timeout
(f :
?full_st_name:Eliom_common.full_state_name
-> ?cookie_level:[< Eliom_common.cookie_level]
-> recompute_expdates:bool
-> bool (* override configfile *)
-> bool (* from config file *)
-> Eliom_common.sitedata
-> float option
-> unit) cookie_type state_hier v
=
let make_full_st_name secure state_hier =
let scope =
match cookie_type with
| `Session -> `Session state_hier
| `Client_process -> `Client_process state_hier
in
Eliom_common.make_full_state_name2
sitedata.Eliom_common.site_dir_string secure ~scope
in
(*VVV We set timeout for both secure and unsecure states.
Make possible to customize this? *)
f
?full_st_name:(Option.map (make_full_st_name false) state_hier)
?cookie_level:(Some cookie_type) ~recompute_expdates:false true true
sitedata v;
f
?full_st_name:(Option.map (make_full_st_name true) state_hier)
?cookie_level:(Some cookie_type) ~recompute_expdates:false true true
sitedata v
in
let oldipv6mask = sitedata.Eliom_common.ipv6mask in
let content =
parse_eliom_options
( (fun ct snoo v ->
set_timeout
(Eliommod_timeouts.set_global_ ~kind:`Data)
ct snoo v;
sitedata ct snoo v;
set_timeout
(Eliommod_timeouts.set_global_ ~kind:`Service)
ct snoo v)
, set_timeout (Eliommod_timeouts.set_global_ ~kind:`Data)
, set_timeout (Eliommod_timeouts.set_global_ ~kind:`Service)
, set_timeout (Eliommod_timeouts.set_global_ ~kind:`Persistent)
sitedata ct snoo v)
, set_timeout (Eliommod_timeouts.set_global_ ~kind:`Data) sitedata
, set_timeout
(Eliommod_timeouts.set_global_ ~kind:`Service)
sitedata
, set_timeout
(Eliommod_timeouts.set_global_ ~kind:`Persistent)
sitedata
, (fun v ->
sitedata.Eliom_common.max_service_sessions_per_group <- v, true)
, (fun v ->
Expand Down
Loading

0 comments on commit 69197bc

Please sign in to comment.