open Printf;;
open Http_types;;
(*** from matitaScript.ml ***)
(* let only_dust_RE = Pcre.regexp "^(\\s|\n|%%[^\n]*\n)*$" *)
let eval_statement include_paths (* (buffer : GText.buffer) *) status (* script *)
statement
=
let ast,unparsed_text =
match statement with
| `Raw text ->
(* if Pcre.pmatch ~rex:only_dust_RE text then raise Margin; *)
let strm =
GrafiteParser.parsable_statement status
(Ulexing.from_utf8_string text) in
let ast = MatitaEngine.get_ast status include_paths strm in
ast, text
| `Ast (st, text) -> st, text
in
let floc = match ast with
| GrafiteAst.Executable (loc, _)
| GrafiteAst.Comment (loc, _) -> loc in
let _,lend = HExtlib.loc_of_floc floc in
let parsed_text, parsed_text_len =
MatitaGtkMisc.utf8_parsed_text unparsed_text (HExtlib.floc_of_loc (0,lend)) in
let status =
MatitaEngine.eval_ast ~include_paths ~do_heavy_checks:false status ("",0,ast)
in
(status, parsed_text),"",(*parsed_text_len*) Glib.Utf8.length parsed_text
let status = ref (new MatitaEngine.status "cic:/matita");;
let include_paths = ["/home/barolo/matitaB/matita/lib"];;
let advance text (* (?bos=false) *) =
(* if bos then LibraryClean.clean_baseuris [self#buri_of_current_file];
(* HLog.debug ("evaluating: " ^ first_line s ^ " ...");*)
let time1 = Unix.gettimeofday () in
let entries, newtext, parsed_len = *)
let (st,_),_,parsed_len =
(* try *)
eval_statement include_paths (*buffer*) !status (`Raw text)
(* with End_of_file -> raise Margin *)
in
status := st;
let _,_,metasenv,subst,_ = !status#obj in
let txt = List.fold_left
(fun acc (nmeta,_ as meta) ->
let txt0 = Netencoding.Html.encode ~in_enc:`Enc_utf8 ()
(snd (ApplyTransformation.ntxt_of_cic_sequent
~metasenv ~subst ~map_unicode_to_tex:false 80 !status meta)) in
("Goal ?" ^ (string_of_int nmeta) ^ "\n" ^ txt0)::acc)
[] metasenv
in
let txt = String.concat "\n\n" txt in
parsed_len, txt
(*in
let time2 = Unix.gettimeofday () in
HLog.debug ("... done in " ^ string_of_float (time2 -. time1) ^ "s");
let new_statuses, new_statements =
let statuses, texts = List.split entries in
statuses, texts
in
history <- new_statuses @ history;
statements <- new_statements @ statements;
let start = buffer#get_iter_at_mark (`MARK locked_mark) in
let new_text = String.concat "" (List.rev new_statements) in
if statement <> None then
buffer#insert ~iter:start new_text
else begin
let parsed_text = String.sub s 0 parsed_len in
if new_text <> parsed_text then begin
let stop = start#copy#forward_chars (Glib.Utf8.length parsed_text) in
buffer#delete ~start ~stop;
buffer#insert ~iter:start new_text;
end;
end;
self#moveMark (Glib.Utf8.length new_text);
buffer#insert ~iter:(buffer#get_iter_at_mark (`MARK locked_mark)) newtext*)
;;
let read_file fname =
let chan = open_in fname in
let lines = ref [] in
(try
while true do
lines := input_line chan :: !lines
done;
with End_of_file -> close_in chan);
String.concat "\r\n" (List.rev !lines)
;;
let load_index outchan =
let s = read_file "index.html" in
Http_daemon.respond ~headers:["Content-Type", "text/html"] ~code:(`Code 200) ~body:s outchan
;;
let call_service outchan =
try
(ignore(MatitaEngine.assert_ng
~include_paths:["/home/barolo/matitaB/matita/lib"] (* ~outch:outchan *)
"/home/barolo/matitaB/matita/lib/basics/pts.ma");
prerr_endline "fatto";
let s = read_file "/home/barolo/matitaB/matita/lib/basics/pts.ma.mad"
in
Http_daemon.respond ~headers:["Content-Type", "text/html"] ~code:(`Code 200) ~body:s outchan
)
with
e -> Http_daemon.respond ~code:(`Code 500) outchan
;;
let callback req outchan =
let str =
(sprintf "request path = %s\n" req#path) ^
(sprintf "request GET params = %s\n"
(String.concat ";"
(List.map (fun (h,v) -> String.concat "=" [h;v]) req#params_GET))) ^
(sprintf "request POST params = %s\n"
(String.concat ";"
(List.map (fun (h,v) -> String.concat "=" [h;v]) req#params_POST))) ^
(sprintf "request ALL params = %s\n"
(String.concat ";"
(List.map (fun (h,v) -> String.concat "=" [h;v]) req#params))) ^
(sprintf "cookies = %s\n"
(match req#cookies with
| None ->
"NO COOKIES "
^ (if req#hasHeader ~name:"cookie"
then "('Cookie:' header was '" ^ req#header ~name:"cookie" ^ "')"
else "(No 'Cookie:' header received)")
| Some cookies ->
(String.concat ";"
(List.map (fun (n,v) -> String.concat "=" [n;v]) cookies)))) ^
(sprintf "request BODY = '%s'\n\n" req#body)
in
(* Http_daemon.respond ~code:(`Code 200) ~body: str outchan *)
prerr_endline str;
match req#path with
| "/" -> load_index outchan
| "/matita" -> call_service outchan
| "/open" ->
prerr_endline "getting 'file' argument";
let filename = List.assoc "file" req#params_GET in
prerr_endline ("reading file " ^ filename);
let body = read_file filename in
let _,baseuri,_,_ =
Librarian.baseuri_of_script ~include_paths:[] filename
in
status := (!status)#set_baseuri baseuri;
Http_daemon.respond ~code:(`Code 200) ~body outchan
| "/advance" ->
let script = req#body in
prerr_endline ("body length = " ^ (string_of_int (String.length script)));
let (parsed_len,txt), res, code =
try advance script, "OK", `Code 200
with
| HExtlib.Localized(_,e)
| e ->
(prerr_endline ("exception: " ^ Printexc.to_string e);
(try
NTacStatus.pp_tac_status !status
with e -> prerr_endline ("inner exception: " ^
Printexc.to_string e));
prerr_endline "end status";
let _,_,metasenv,subst,_ = !status#obj in
let txt = List.fold_left
(fun acc (nmeta,_ as meta) ->
let txt0 = Netencoding.Html.encode ~in_enc:`Enc_utf8 ()
(snd (ApplyTransformation.ntxt_of_cic_sequent
~metasenv ~subst ~map_unicode_to_tex:false 80 !status meta)) in
("Goal ?" ^ (string_of_int nmeta) ^ "\n" ^ txt0)::acc)
[] metasenv
in
let txt = String.concat "\n\n" txt in
(0,txt), Printexc.to_string e, `Code 500)
in
let txt = Netencoding.Url.encode ~plus:false txt in
let body = (string_of_int parsed_len) ^ "#" ^ txt in
Http_daemon.respond ~code ~body outchan
| url -> Http_daemon.respond_not_found ~url outchan
;;
let spec =
{ Http_daemon.default_spec with
callback = callback;
port = 9999;
mode = `Single;
}
;;
let _ =
MatitaInit.initialize_all ();
Http_daemon.main spec
;;