From e5bcbde6444db75c78ddacee2d4c36b7f9444a85 Mon Sep 17 00:00:00 2001 From: ygrek Date: Sun, 13 Sep 2009 11:16:43 +0300 Subject: [PATCH] start --- Makefile | 8 ++++++ _tags | 4 +++ main.ml | 6 ++++ myocamlbuild.ml | 50 ++++++++++++++++++++++++++++++++++ myocamlbuild_config.ml | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++ request.ml | 31 +++++++++++++++++++++ 6 files changed, 173 insertions(+) create mode 100644 Makefile create mode 100644 _tags create mode 100644 main.ml create mode 100644 myocamlbuild.ml create mode 100644 myocamlbuild_config.ml create mode 100644 request.ml diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..805905c --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ + +.PHONY: build clean + +build: + ocamlbuild -j 0 main.native + +clean: + ocamlbuild -clean diff --git a/_tags b/_tags new file mode 100644 index 0000000..8360379 --- /dev/null +++ b/_tags @@ -0,0 +1,4 @@ +true: annot, debug +true: use_unix, use_pcre +true: use_netsys, use_netstring, use_netchannels, use_netcgi + diff --git a/main.ml b/main.ml new file mode 100644 index 0000000..0ffc2f9 --- /dev/null +++ b/main.ml @@ -0,0 +1,6 @@ + +let () = + Netcgi_cgi.run + ~output_type:(`Direct "") + (fun cgi -> Request.main cgi) + diff --git a/myocamlbuild.ml b/myocamlbuild.ml new file mode 100644 index 0000000..280b6e2 --- /dev/null +++ b/myocamlbuild.ml @@ -0,0 +1,50 @@ +open Ocamlbuild_plugin +open Command + +module C = Myocamlbuild_config + +;; + +let () = + let bracket res destroy k = let x = (try k res with e -> destroy res; raise e) in destroy res; x in + let get_line r d = bracket r d input_line in + + bracket (open_out "version.ml") close_out (fun out -> + let revision = + try + get_line (Unix.open_process_in "git describe --always") (Unix.close_process_in) + with + _ -> (try get_line (open_in "version.id") close_in with _ -> "") + in + Printf.fprintf out "let id=\"%s\"\n" (String.escaped revision) + ) + +;; + +dispatch begin function +| After_rules -> + + C.extern ~cma:"extLib" "extlib"; + C.extern "pcre"; + C.extern "netsys"; + C.extern "netstring"; + C.extern "equeue"; + C.extern "netclient"; + C.extern "netcgi2" ~cma:"netcgi"; + C.extern "oUnit"; + C.extern "zip"; + C.extern "json-wheel" ~cma:"jsonwheel"; + C.extern "sqlite3"; + + flag ["ocaml"; "doc"; "use_extLib"] (S[A"-I"; A (C.lib "extlib")]); + + let flag_bn l x = + flag ("byte"::l) x; + flag ("native"::l) x + in + + flag_bn ["link"; "ocaml"; "use_netstring"; "thread"] (S[A"netstring_mt.cmo"]); + flag_bn ["link"; "ocaml"; "use_equeue"; "thread"] (S[A"unixqueue_mt.cmo"]); + +| _ -> () +end diff --git a/myocamlbuild_config.ml b/myocamlbuild_config.ml new file mode 100644 index 0000000..b5f8628 --- /dev/null +++ b/myocamlbuild_config.ml @@ -0,0 +1,74 @@ +(** + r1 (2009-08-11) + + This ocamlbuild plugin will try to find libraries by name using (in order) + - local myocamlbuild.config file + - ocamlfind + + Sample myocamlbuild.config : + +extlib=C:/my/contrib/extlib-1.5.1 +deriving=C:/my/contrib/deriving-0.1.1/lib +oUnit=C:/my/contrib/ounit-1.0.3 + +*) + +(** querying ocamlfind *) + +let chomp s = + let is_nl ch = match ch with | '\n' | '\r' -> true | _ -> false in + let rec cut n = + if n = 0 then 0 else if is_nl s.[n-1] then cut (n-1) else n + in + let ls = String.length s in + let n = cut ls in + if n = ls then s else String.sub s 0 n + +let ocamlfind lib = + let cin = Unix.open_process_in (Printf.sprintf "ocamlfind -query %s" lib) in + let s = chomp (input_line cin) in + (* let s = Filename.quote s in*) + ignore (Unix.close_process_in cin); + s + +(** querying config *) + +let file_lines name = + let l = ref [] in + begin try + let ch = open_in name in + begin try while true do l := input_line ch :: !l done with End_of_file -> () end; + close_in_noerr ch + with + exn -> () + end; + !l + +let read_config name = + let l = file_lines name in + let split s = + let index = String.index s '=' in + (String.sub s 0 index, String.sub s (index+1) ((String.length s) - index - 1)) + in + let split s = try split s with _ -> "","" in + List.map split l + +(** usage *) + +let config = read_config "myocamlbuild.config" +let () = + match config with + | [] -> prerr_endline "No config, will use ocamlfind" + | _ -> prerr_endline "Using config : "; + List.iter (fun (x,y) -> Printf.eprintf "%s=%s\n%!" x y) config + +let lib name = + try + List.assoc name config + with exn -> + try + ocamlfind name + with exn -> + "+" ^ name + +let extern ?cma pkg_name = Ocamlbuild_plugin.ocaml_lib ~extern:true ~dir:(lib pkg_name) (match cma with Some s -> s | None -> pkg_name) diff --git a/request.ml b/request.ml new file mode 100644 index 0000000..38d23e5 --- /dev/null +++ b/request.ml @@ -0,0 +1,31 @@ + +open Printf +open Netcgi + +let main (cgi:cgi) = + let env = cgi#environment in + let cgi_arg name = try Some (cgi#argument name)#value with _ -> None in + let outs = cgi#out_channel#output_string in + let out fmt = ksprintf outs fmt in + + let dump_cgi () = + out "cgi_properties\n"; + List.iter (fun (k,v) -> out "%s = %s\n" k v) env#cgi_properties; + out "input_header_fields\n"; + List.iter (fun (k,v) -> out "%s = %s\n" k v) env#input_header_fields; + out "cgi_arguments\n"; + List.iter (fun x -> out "%s = %s\n" x#name x#value) cgi#arguments + in + + cgi#set_header ~cache:`No_cache ~content_type:"text/plain" (); + dump_cgi (); + + () + +let main (cgi:cgi) = + try + main cgi; + cgi#out_channel#commit_work (); + with + _ -> cgi#out_channel#rollback_work () + -- 2.11.4.GIT