X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fhttp_getter%2Fhttp_getter.ml;h=501b9d8390dd8692488a0d095ed87adeffd92077;hb=734a6fc5d8da4896c646d1dd7a17afaf0dd33224;hp=b5cfa47d9564561c09783dfb85b702ae280f7605;hpb=2779c4191d0c14aa7bec9a861974a6a1f815ca03;p=helm.git diff --git a/helm/http_getter/http_getter.ml b/helm/http_getter/http_getter.ml index b5cfa47d9..501b9d839 100644 --- a/helm/http_getter/http_getter.ml +++ b/helm/http_getter/http_getter.ml @@ -105,7 +105,10 @@ let resolve uri = with Http_getter_map.Key_not_found _ -> raise (Http_getter_unresolvable_URI uri) in -let register uri = (map_of_uri uri )#add uri in +let register uri = + (* Warning: this fail if uri is already registered *) + (map_of_uri uri)#add uri +in let return_all_foo_uris map doctype filter outchan = (** return all URIs contained in 'map' which satisfy predicate 'filter'; URIs are written in an XMLish format ('doctype' is the XML doctype) onto 'outchan' @@ -290,10 +293,12 @@ let update_from_server logmsg server_url = (* use global maps *) (match Pcre.split ~rex:index_line_sep_RE l with | [uri; "gz"] -> assert (is_cic_uri uri || is_nuprl_uri uri) ; - (map_of_uri uri)#add uri ((xml_url_of_uri uri) ^ ".xml.gz") + (map_of_uri uri)#replace + uri ((xml_url_of_uri uri) ^ ".xml.gz") | [uri] -> assert (is_cic_uri uri || is_nuprl_uri uri) ; - (map_of_uri uri)#add uri ((xml_url_of_uri uri) ^ ".xml") + (map_of_uri uri)#replace + uri ((xml_url_of_uri uri) ^ ".xml") | _ -> log := !log ^ "Ignoring invalid line: '" ^ l ^ "'
\n") with Http_getter_invalid_URI uri -> @@ -307,8 +312,9 @@ let update_from_server logmsg server_url = (* use global maps *) (fun l -> try (match Pcre.split ~rex:index_line_sep_RE l with - | [uri; "gz"] -> rdf_map#add uri ((rdf_url_of_uri uri) ^ ".xml.gz") - | [uri] -> rdf_map#add uri ((rdf_url_of_uri uri) ^ ".xml") + | [uri; "gz"] -> + rdf_map#replace uri ((rdf_url_of_uri uri) ^ ".xml.gz") + | [uri] -> rdf_map#replace uri ((rdf_url_of_uri uri) ^ ".xml") | _ -> log := !log ^ "Ignoring invalid line: " ^ l ^ "
\n") with Http_getter_invalid_URI uri -> log := !log ^ "Ignoring invalid RDF URI: " ^ uri ^ "
\n") @@ -318,13 +324,25 @@ let update_from_server logmsg server_url = (* use global maps *) | Some xsl_index -> (log := !log ^ "Updating XSLT db ...
\n"; List.iter - (fun l -> xsl_map#add l (server_url ^ "/" ^ l)) + (fun l -> xsl_map#replace l (server_url ^ "/" ^ l)) (Pcre.split ~rex:index_sep_RE xsl_index); log := !log ^ "All done!
\n") | None -> ()); debug_print "done with this server"; !log in +let update_from_all_servers () = (* use global maps *) + cic_map#clear; nuprl_map#clear; rdf_map#clear; xsl_map#clear; + let log = + List.fold_left + update_from_server + "" (* initial logmsg: empty *) + (* reverse order: 1st server is the most important one *) + (List.rev !Http_getter_env.servers) + in + cic_map#sync; nuprl_map#sync; rdf_map#sync; xsl_map#sync; + log +in (* thread action *) @@ -333,7 +351,10 @@ let callback (req: Http_types.request) outchan = debug_print ("Connection from " ^ req#clientAddr); debug_print ("Received request: " ^ req#path); (match req#path with - | "/help" -> return_html_raw Http_getter_const.usage_string outchan + | "/help" -> + return_html_raw + (Http_getter_const.usage_string (Http_getter_env.env_to_string ())) + outchan | "/getxml" | "/getxslt" | "/getdtd" | "/resolve" | "/register" -> (let uri = req#param "uri" in (* common parameter *) match req#path with @@ -362,17 +383,74 @@ let callback (req: Http_types.request) outchan = return_html_msg "Register done" outchan | _ -> assert false) | "/update" -> - (Http_getter_env.reload (); (* reload servers list from servers file *) - cic_map#clear; nuprl_map#clear; rdf_map#clear; xsl_map#clear; - let log = - List.fold_left - update_from_server - "" (* initial logmsg: empty *) - (* reverse order: 1st server is the most important one *) - (List.rev !Http_getter_env.servers) + Http_getter_env.reload (); (* reload servers list from servers file *) + let log = update_from_all_servers () in + return_html_msg log outchan + | "/list_servers" -> + return_html_raw + (sprintf "\n%s\n
" + (String.concat "\n" + (List.map + (let i = ref ~-1 in + fun s -> incr i; sprintf "%d%s" !i s) + !Http_getter_env.servers))) + outchan + | "/add_server" -> + let name = req#param "url" in + (try + let position = + try + let res = int_of_string (req#param "position") in + if res < 0 then + raise (Failure "int_of_string"); + res + with Failure "int_of_string" -> + raise (Http_getter_bad_request + (sprintf "position must be a non negative integer (%s given)" + (req#param "position"))) + in + if position = 0 then (* fallback to default value *) + raise (Http_types.Param_not_found "foo") + else if position > 0 then begin (* add server and update all *) + Http_getter_env.add_server ~position name; + let log = update_from_all_servers () in + return_html_msg + (sprintf "Added server %s in position %d)
\n%s" + name position log) + outchan + end else (* position < 0 *) (* error! *) + assert false (* already checked above *) + with Http_types.Param_not_found _ -> (* add as 1st server by default *) + Http_getter_env.add_server ~position:0 name; + let log = update_from_server (* quick update (new server only) *) + (sprintf "Added server %s in head position
\n" name) name + in + return_html_msg log outchan) + | "/remove_server" -> + let position = + try + let res = int_of_string (req#param "position") in + if res < 0 then + raise (Failure "int_of_string"); + res + with Failure "int_of_string" -> + raise (Http_getter_bad_request + (sprintf "position must be a non negative integer (%s given)" + (req#param "position"))) in - cic_map#sync; nuprl_map#sync; rdf_map#sync; xsl_map#sync; - return_html_msg log outchan) + let server_name = + try + List.nth !Http_getter_env.servers position + with Failure "nth" -> + raise (Http_getter_bad_request + (sprintf "no server with position %d" position)) + in + Http_getter_env.remove_server position; + let log = update_from_all_servers () in + return_html_msg + (sprintf "Removed server %s (position %d)
\n%s" + server_name position log) + outchan | "/getalluris" -> return_all_xml_uris (fun uri -> @@ -421,7 +499,8 @@ in (* daemon initialization *) let main () = - Http_getter_env.dump_env (); + print_string (Http_getter_env.env_to_string ()); + flush stdout; Unix.putenv "http_proxy" ""; at_exit save_maps; Sys.catch_break true;