X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fuwobo%2Fsrc%2Focaml%2Fuwobo.ml;h=22714b29a837b6ba18bcb3edb144a5b3b2590568;hb=89262281b6e83bd2321150f81f1a0583645eb0c8;hp=4584e091044298e3cc1c4261c18d165fb1d7df05;hpb=6c555e40c353451ae479b8be5a31f67517682122;p=helm.git diff --git a/helm/uwobo/src/ocaml/uwobo.ml b/helm/uwobo/src/ocaml/uwobo.ml index 4584e0910..22714b29a 100644 --- a/helm/uwobo/src/ocaml/uwobo.ml +++ b/helm/uwobo/src/ocaml/uwobo.ml @@ -24,6 +24,9 @@ * http://cs.unibo.it/helm/. *) +(* TODO braindead situation: /add of a stylesheet which uri is an uwobo +invocation *) + open Printf;; open Uwobo_common;; @@ -38,6 +41,8 @@ Http_common.debug := http_debug;; let daemon_name = "UWOBO OCaml";; let default_port = 8082;; let port_env_var = "UWOBO_PORT";; +let default_media_type = "text/html";; +let default_encoding = "utf8";; let port = try int_of_string (Sys.getenv port_env_var) @@ -50,9 +55,8 @@ in (* facilities *) let pp_error = sprintf "

Error: %s

" in -let invocation_error msg outchan = - (* return an ok (200) http response, which display in html an invocation error - message *) +let return_error msg outchan = + (* return an ok (200) http response, which display in html an error message *) Http_daemon.respond ~body:(pp_error msg) outchan in let bad_request body outchan = (* return a bad request http response *) @@ -63,7 +67,62 @@ in let syslogger = new Uwobo_logger.sysLogger ~level:debug_level () in syslogger#enable; let styles = new Uwobo_styles.styles in -let usage_string = "Help message: not yet written!!" in (* TODO *) +let usage_string = + sprintf +" + + + UWOBO's help message + + +

+ Usage: http://hostname:uwoboport/command +

+

+ Available commands: +

+

+ help
+ display this help message +

+

+ add?bind=key,uri[&bind=key,stylesheet[&...]]
+ load a new stylesheet, specified by uri, and bind it to key + key +

+

+ remove?[?keys=key1,key2,...]
+ unload stylesheets specified by key1, key2, ... or all + stylesheets if no key was given +

+

+ reload?[?keys=key1,key2,...]
+ reload stylesheets specified by key1, key2, ... or all + stylesheets if no key was given +

+

+ list
+ return a list of loaded stylesheets +

+

+ apply?xmluri=uri&keys=key1,key2,...[¶m.name=value[¶m.name=value[&...]]][¶m.key.name=value[¶m.key.name=value[&...]]][&name[=value][&prop.name[=value][&...]]]
+ apply a chain of stylesheets, specified by key1, key2, ..., to an + input document, specified by uri.
+ Additional parameters can be set for each stylesheet application: global + parameters (i.e. parameters passed to all stylesheets) are set using + param.name=value syntax, per stylesheet parameters are set using + param.key.name=value where key is the key of a loaded + stylesheet.
+ Properties of the final chain output can be set too: valueless properties + can be set using prop.name syntax, others can be set using + prop.name=value syntax.
+ Current supported properties are: %s. +

+ + +" + (String.concat ", " Uwobo_common.supported_properties) +in (* thread action *) let callback req outchan = @@ -117,7 +176,7 @@ let callback req outchan = | "/add" -> (let bindings = req#paramAll "bind" in if bindings = [] then - invocation_error "No [key,stylesheet] binding provided" outchan + return_error "No [key,stylesheet] binding provided" outchan else begin let log = new Uwobo_logger.processingLogger () in List.iter @@ -147,45 +206,43 @@ let callback req outchan = act_on_keys req styles outchan styles#reload (fun () -> styles#reloadAll) "reloading" - | "/apply" -> - (let logger = new Uwobo_logger.processingLogger () in - let xmluri = req#param "xmluri" in - let keys = Pcre.split ~pat:"," (req#param "keys") in - (* notation: "local" parameters are those defined on a per-stylesheet - pasis (i.e. param.key.param=value), "global" parameters are those - defined for all stylesheets (i.e. param.param=value) *) - let (params, props) = parse_apply_params req#params in - syslogger#log `Debug (sprintf "Parsing input document %s ..." xmluri); - let domImpl = Gdome.domImplementation () in - let input = domImpl#createDocumentFromURI ~uri:xmluri () in - syslogger#log `Debug "Applying stylesheet chain ..."; - let output = - Uwobo_engine.apply - ~logger:syslogger ~styles ~keys ~input ~params ~props - (* TODO uhm ... what to do if Uwobo_failure is raised? *) - in -(* syslogger#log `Debug logger#asText; *) - let tempfile = (* temporary file on which save XML output *) - (* TODO I don't need a tempfile, but gdome seems not to permit to - return the string representation of a Gdome.document *) - let inchan = Unix.open_process_in "tempfile --prefix=uwobo" in - let name = input_line inchan in - close_in inchan; - name - in - syslogger#log - `Debug - (sprintf "saving output document to %s ..." tempfile); - let res = domImpl#saveDocumentToFile ~doc:output ~name:tempfile () in - if not res then - raise (Uwobo_failure ("unable to save output to file " ^ tempfile)); - syslogger#log `Debug "sending output to client ...."; - Http_daemon.send_basic_headers ~code:200 outchan; - (* TODO set Content-Type *) - Http_daemon.send_CRLF outchan; - Http_daemon.send_file ~name:tempfile outchan; - Unix.unlink tempfile) + if Unix.fork () = 0 then + (let logger = new Uwobo_logger.processingLogger () in + let xmluri = req#param "xmluri" in + let keys = Pcre.split ~pat:"," (req#param "keys") in + (* notation: "local" parameters are those defined on a per-stylesheet + pasis (i.e. param.key.param=value), "global" parameters are those + defined for all stylesheets (i.e. param.param=value) *) + let (params, props) = parse_apply_params req#params in + syslogger#log `Debug (sprintf "Parsing input document %s ..." xmluri); + let domImpl = Gdome.domImplementation () in + let input = domImpl#createDocumentFromURI ~uri:xmluri () in + syslogger#log `Debug "Applying stylesheet chain ..."; + try + let (write_result, media_type, encoding) = (* out_channel -> unit *) + Uwobo_engine.apply + ~logger:syslogger ~styles ~keys ~input ~params ~props + in + let content_type = (* value of Content-Type HTTP response header *) + sprintf + "%s; charset=%s" + (match media_type with None -> default_media_type | Some t -> t) + (match encoding with None -> default_encoding | Some e -> e) + in + syslogger#log + `Debug + (sprintf + "sending output to client (Content-Type: %s)...." + content_type); + Http_daemon.send_basic_headers ~code:200 outchan; + Http_daemon.send_header "Content-Type" content_type outchan; + Http_daemon.send_CRLF outchan; + write_result outchan + with Uwobo_failure errmsg -> + return_error + (sprintf "Stylesheet chain application failed: %s" errmsg) + outchan) | "/help" -> Http_daemon.respond ~body:usage_string outchan | invalid_request -> Http_daemon.respond_error ~status:(`Client_error `Bad_request) outchan) @@ -203,6 +260,7 @@ syslogger#log `Notice (sprintf "%s started and listening on port %d" daemon_name port); syslogger#log `Notice (sprintf "current directory is %s" (Sys.getcwd ())); +Unix.putenv "http_proxy" ""; (* reset http_proxy to avoid libxslt problems *) Http_daemon.start' ~port ~mode:`Thread callback; syslogger#log `Notice (sprintf "%s is terminating, bye!" daemon_name)