ocamlocsigen

Can't launch ocsigen server due to failure : ("That function cannot be called here because it needs information about the request or the site.")


I want to create a service who generates its HTML according to the parameter given and a map. Given the parameter, the service search in the map for the html, and a function to launch on client side.

type sample =
  (string (* little text *)*
   Html5_types.html Eliom_content.Html5.elt (* html page *) *
  (unit -> unit)(* Demonstration function *))

Given that the function is to be launched on client side, I insert it in the map as a client value :

{client{
 let demo_function = ignore (Ojquery.add_html 
                             (Ojquery.jQ "li") "<p id='test1'>new paragraph</p>") }}

let get_samples () =
  let samples_map = Samples.empty in
  let samples_map = Samples.add "add_html"
    ("text",
     (Eliom_tools.F.html
       (** html stuff **)
      ),
   {unit->unit{demo_function}}) samples_map in
  samples_map

And then I register the service like this :

let sample_service =
  Eliom_service.service
    ~path:["examples"]
    ~get_params:Eliom_parameter.(string "entry")
  ()
let () =
  Examples_app.register
    ~service:sample_service
    (fun (entry) () ->
      try
        (let entry = Samples.find entry samples_map in
        let html = ((function (name, html, func) -> html) entry) in
        let func = ((function (name, html, func) -> func) entry) in
        ignore {unit{%func ()}};
        Lwt.return (html))
    with Not_found -> Lwt.return (not_found)
  )

The rest of the code is pretty much only the result of a classic eliom-distillery, with the inclusion of the ojquery package for the client function used. The compilation phase goes smoothly, but when I try to launch the server, I get the following error message :

ocsigenserver: main: Fatal - Error in configuration file: Error while parsing configuration file: Eliom: while loading local/lib/examples/examples.cma: Failure("That function cannot be called here because it needs information about the request or the site.")

My first guess was that it is due to the fact that I store client values outside of a service, but is there any way to store this kind of values on the server?

I tried to wrap them in regular functions : let demo_serv_func () = {unit{demo_client_func ()}}

But the problem remained...


Solution

  • I found the issue. The problem was not because I stored client functions, but because I used Eliom_tools.F.html outside of a service.

    It happens that Eliom_tools needs the context of the service to function, and since I was storing it outside of the service, it could not work.

    I solved the issue by using Eliom_tools inside the service, and storing the body of the HTML page in the map.