2 * Copyright (C) 2003-2004:
3 * Stefano Zacchiroli <zack@cs.unibo.it>
4 * for the HELM Team http://helm.cs.unibo.it/
6 * This file is part of HELM, an Hypertextual, Electronic
7 * Library of Mathematics, developed at the Computer Science
8 * Department, University of Bologna, Italy.
10 * HELM is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
15 * HELM is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with HELM; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
25 * For details, see the HELM World-Wide-Web page,
26 * http://helm.cs.unibo.it/
31 open Http_getter_types
33 let version = Http_getter_const.version
35 let servers_file = lazy (
36 Helm_registry.get_opt Helm_registry.get "getter.servers_file")
37 let cic_dbm = lazy (Helm_registry.get "getter.maps_dir" ^ "/cic_db")
38 let cic_dbm_real = lazy (Helm_registry.get "getter.maps_dir" ^ "/cic_db.pag")
39 let nuprl_dbm = lazy (Helm_registry.get "getter.maps_dir" ^ "/nuprl_db")
40 let rdf_dbm = lazy (Helm_registry.get "getter.maps_dir" ^ "/rdf_db")
41 let xsl_dbm = lazy (Helm_registry.get "getter.maps_dir" ^ "/xsl_db")
42 let dump_file = lazy (Helm_registry.get "getter.maps_dir" ^
44 let prefetch = lazy (Helm_registry.get_bool "getter.prefetch")
45 let xml_index = lazy (
46 Helm_registry.get_opt_default Helm_registry.get "index.txt"
47 "getter.xml_indexname")
48 let rdf_index = lazy (
49 Helm_registry.get_opt_default Helm_registry.get "rdf_index.txt"
50 "getter.rdf_indexname")
51 let xsl_index = lazy (
52 Helm_registry.get_opt_default Helm_registry.get "xslt_index.txt"
53 "getter.xsl_indexname")
54 let cic_dir = lazy (Helm_registry.get "getter.cache_dir" ^ "/cic")
55 let nuprl_dir = lazy (Helm_registry.get "getter.cache_dir" ^ "/nuprl")
56 let rdf_dir = lazy (Helm_registry.get "getter.cache_dir" ^ "/rdf")
57 let dtd_dir = lazy (Helm_registry.get "getter.dtd_dir")
58 let dtd_base_urls = lazy (
59 let rex = Pcre.regexp "/*$" in
61 Helm_registry.get_opt_default Helm_registry.get_string_list
62 ["http://helm.cs.unibo.it/dtd"; "http://mowgli.cs.unibo.it/dtd"]
63 "getter.dtd_base_urls"
65 List.map (Pcre.replace ~rex) raw_urls)
67 Helm_registry.get_opt_default Helm_registry.get_int 58081 "getter.port")
69 let _servers = ref None
74 | None -> failwith "Getter not yet initialized: servers not available"
75 | Some servers -> servers)
79 match Lazy.force servers_file with
81 List.map (fun s -> incr pos; (!pos, s))
82 (Helm_registry.get_string_list "getter.servers")
83 | Some servers_file ->
84 List.rev (Http_getter_misc.fold_file
86 if Http_getter_misc.is_blank_line line then
89 (incr pos; (!pos, line) :: servers))
93 let reload_servers () = _servers := Some (load_servers ())
96 match Lazy.force servers_file with
98 | Some servers_file ->
99 let oc = open_out servers_file in
100 List.iter (fun (_,server) -> output_string oc (server ^ "\n"))
106 (let buf = Buffer.create 20 in
107 Shell.call ~stdout:(Shell.to_buffer buf) [Shell.cmd "hostname" ["-f"]];
108 Pcre.replace ~pat:"\n+$" (Buffer.contents buf))
112 (let (host, port) = (Lazy.force host, Lazy.force port) in
113 sprintf "http://%s%s" (* without trailing '/' *)
114 host (if port = 80 then "" else (sprintf ":%d" port)))
119 Helm_registry.get_opt_default Helm_registry.get "gz" "getter.cache_mode"
121 match String.lowercase mode_string with
122 | "normal" -> `Normal
124 | mode -> failwith ("Invalid cache mode: " ^ mode))
126 let reload () = reload_servers ()
128 let env_to_string () =
130 "HTTP Getter %s (the OCaml one!)
156 version (Lazy.force cic_dbm) (Lazy.force nuprl_dbm) (Lazy.force rdf_dbm)
157 (Lazy.force xsl_dbm) (Lazy.force xml_index)
158 (Lazy.force rdf_index) (Lazy.force xsl_index) (Lazy.force cic_dir)
159 (Lazy.force nuprl_dir) (Lazy.force rdf_dir)
160 (Lazy.force dtd_dir) (Lazy.force dump_file) (Lazy.force prefetch)
161 (match Lazy.force servers_file with
162 | None -> "no servers file"
163 | Some servers_file -> servers_file)
165 (Lazy.force port) (Lazy.force my_own_url)
166 (String.concat " " (Lazy.force dtd_base_urls))
167 (match Lazy.force cache_mode with
168 | `Normal -> "Normal"
169 | `Gzipped -> "GZipped")
170 (String.concat "\n\t" (* (position * server) list *)
171 (List.map (fun (pos, server) -> sprintf "%3d: %s" pos server)
173 (match Http_getter_logger.get_log_file () with None -> "None" | Some f -> f)
174 (Http_getter_logger.get_log_level ())
176 let add_server ?position url =
178 let servers = servers () in
180 | None -> servers @ [-1, url];
181 | Some p when p > 0 ->
182 let rec add_after pos = function
184 | hd :: tl when p = 1 -> hd :: (-1, url) :: tl
185 | hd :: tl (* when p > 1 *) -> hd :: (add_after (pos - 1) tl)
188 | Some 0 -> (-1, url)::servers
189 | Some _ -> assert false
191 _servers := Some new_servers;
195 let remove_server position =
196 _servers := Some (List.remove_assoc position (servers ()));