From 25ea9bc8e482928f0d91ff0452cba12d65e5a910 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Fri, 18 Oct 2013 23:52:22 +0200 Subject: [PATCH] specify a socket file in ToWeb --- _oasis | 7 +++++++ _tags | 9 ++++++++- examples/web_pwd.ml | 26 ++++++++++++++++++++++++++ setup.ml | 38 +++++++++++++++++++++++++++++++++++--- toWeb.ml | 18 ++++++++++++++---- toWeb.mli | 12 ++++++++---- 6 files changed, 98 insertions(+), 12 deletions(-) create mode 100644 examples/web_pwd.ml diff --git a/_oasis b/_oasis index ff73f916..1a54800c 100644 --- a/_oasis +++ b/_oasis @@ -100,6 +100,13 @@ Executable run_tests Build$: flag(tests) && flag(lwt) BuildDepends: containers, oUnit, lwt +Executable web_pwd + Path: examples + Install: false + MainIs: web_pwd.ml + Build$: flag(cgi) + BuildDepends: containers_cgi, threads, CamlGI + SourceRepository head Type: git Location: https://github.com/c-cube/ocaml-containers diff --git a/_tags b/_tags index 9f99eb90..ee066999 100644 --- a/_tags +++ b/_tags @@ -1,5 +1,5 @@ # OASIS_START -# DO NOT EDIT (digest: 2ccc5fef0936d36155ec2a8d19a2c516) +# DO NOT EDIT (digest: 79585995b18632ac90365c888b75c5ba) # Ignore VCS directories, you can use the same kind of rule outside # OASIS_START/STOP if you want to exclude directories that contains # useless stuff for the build process @@ -75,4 +75,11 @@ : pkg_oUnit : pkg_lwt : pkg_unix +# Executable web_pwd +"examples/web_pwd.byte": pkg_containers_cgi +"examples/web_pwd.byte": pkg_threads +"examples/web_pwd.byte": pkg_CamlGI +: pkg_containers_cgi +: pkg_threads +: pkg_CamlGI # OASIS_STOP diff --git a/examples/web_pwd.ml b/examples/web_pwd.ml new file mode 100644 index 00000000..649dc4f1 --- /dev/null +++ b/examples/web_pwd.ml @@ -0,0 +1,26 @@ + +(** Export the list of files in a directory *) + +let dir = "/tmp/" + +(* list of files in a dir *) +let lsdir dir = + let d = Unix.opendir dir in + let l = ref [] in + begin try while true do + l := Unix.readdir d :: !l + done with End_of_file -> Unix.closedir d + end; + !l + +let export dir = + let l = lsdir dir in + ToWeb.HTML.(concat + [ h1 (str ("files in "^ dir)) + ; list (List.map str l) + ]) + +let state = ToWeb.State.create dir ~export + +let _ = + ToWeb.serve_state ~sockfile:"/tmp/foo.sock" state diff --git a/setup.ml b/setup.ml index 2e7f6a5f..5c8ad975 100644 --- a/setup.ml +++ b/setup.ml @@ -1,7 +1,7 @@ (* setup.ml generated for the first time by OASIS v0.3.0 *) (* OASIS_START *) -(* DO NOT EDIT (digest: f32ca79fc0b4813e77bbd8481226d30d) *) +(* DO NOT EDIT (digest: e88f591350fc76aa4ff518bff87740a1) *) (* Regenerated by OASIS v0.3.0 Visit http://oasis.forge.ocamlcore.org for more information and @@ -6157,6 +6157,38 @@ let setup_t = InternalExecutable "run_tests" ]; }); + Executable + ({ + cs_name = "web_pwd"; + cs_data = PropList.Data.create (); + cs_plugin_data = []; + }, + { + bs_build = + [ + (OASISExpr.EBool true, false); + (OASISExpr.EFlag "cgi", true) + ]; + bs_install = [(OASISExpr.EBool true, false)]; + bs_path = "examples"; + bs_compiled_object = Byte; + bs_build_depends = + [ + FindlibPackage ("containers_cgi", None); + FindlibPackage ("threads", None); + FindlibPackage ("CamlGI", None) + ]; + bs_build_tools = [ExternalTool "ocamlbuild"]; + bs_c_sources = []; + bs_data_files = []; + bs_ccopt = [(OASISExpr.EBool true, [])]; + bs_cclib = [(OASISExpr.EBool true, [])]; + bs_dlllib = [(OASISExpr.EBool true, [])]; + bs_dllpath = [(OASISExpr.EBool true, [])]; + bs_byteopt = [(OASISExpr.EBool true, [])]; + bs_nativeopt = [(OASISExpr.EBool true, [])]; + }, + {exec_custom = false; exec_main_is = "web_pwd.ml"; }); SrcRepo ({ cs_name = "head"; @@ -6183,7 +6215,7 @@ let setup_t = }; oasis_fn = Some "_oasis"; oasis_version = "0.3.0"; - oasis_digest = Some "/\253\176\237b\239\208]\237\230B\012\254\227e\207"; + oasis_digest = Some "$\027-\146h\194\205\029\204\206\210\171\235|k-"; oasis_exec = None; oasis_setup_args = []; setup_update = false; @@ -6191,6 +6223,6 @@ let setup_t = let setup () = BaseSetup.setup setup_t;; -# 6195 "setup.ml" +# 6227 "setup.ml" (* OASIS_STOP *) let () = setup ();; diff --git a/toWeb.ml b/toWeb.ml index c7cb18c9..1d2f2fc1 100644 --- a/toWeb.ml +++ b/toWeb.ml @@ -341,8 +341,18 @@ end (** {2 Main Interface} *) -let serve_state ?sockaddr st = - CamlGI.Cgi.register_script ?sockaddr (State.handle_request st) +let serve_state ?sockfile ?sockaddr st = + match sockfile with + | None -> + CamlGI.Cgi.register_script ?sockaddr (State.handle_request st) + | Some f -> + let sockaddr = Unix.ADDR_UNIX f in + CamlGI.Cgi.register_script ~sockaddr (State.handle_request st) -let serve_router ?sockaddr router = - CamlGI.Cgi.register_script ?sockaddr (Router.handle_request router) +let serve_router ?sockfile ?sockaddr router = + match sockfile with + | None -> + CamlGI.Cgi.register_script ?sockaddr (Router.handle_request router) + | Some f -> + let sockaddr = Unix.ADDR_UNIX f in + CamlGI.Cgi.register_script ~sockaddr (Router.handle_request router) diff --git a/toWeb.mli b/toWeb.mli index 07f50fbe..73143795 100644 --- a/toWeb.mli +++ b/toWeb.mli @@ -193,9 +193,13 @@ end (** {2 Main interface} *) -val serve_state : ?sockaddr:Unix.sockaddr -> 'a State.t -> unit - (** Serve incoming requests using a single object. *) +val serve_state : ?sockfile:string -> ?sockaddr:Unix.sockaddr -> + 'a State.t -> unit + (** Serve incoming requests using a single object. + @param sockfile the unix file to use as a socket *) -val serve_router : ?sockaddr:Unix.sockaddr -> Router.t -> unit +val serve_router : ?sockfile:string -> ?sockaddr:Unix.sockaddr -> + Router.t -> unit (** Shortcut. It calls {!CamlGI.Cgi.register_script} with a callback - that forwards requests to the given Router. *) + that forwards requests to the given Router. + @param sockfile the unix file to use as a socket *)