]> matita.cs.unibo.it Git - helm.git/blob - helm/ocaml/getter/http_getter_env.ml
- getter revolution: split backend and frontend (this is the backend)
[helm.git] / helm / ocaml / getter / http_getter_env.ml
1 (*
2  * Copyright (C) 2003-2004:
3  *    Stefano Zacchiroli <zack@cs.unibo.it>
4  *    for the HELM Team http://helm.cs.unibo.it/
5  *
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.
9  *
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.
14  *
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.
19  *
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,
23  *  MA  02111-1307, USA.
24  *
25  *  For details, see the HELM World-Wide-Web page,
26  *  http://helm.cs.unibo.it/
27  *)
28
29 open Printf
30 open Pxp_document
31 open Pxp_types
32 open Pxp_yacc
33
34 open Http_getter_types
35
36 let version = Http_getter_const.version
37
38 let servers_file    = lazy (Helm_registry.get "getter.servers_file")
39 let cic_dbm         = lazy (Helm_registry.get "getter.cic_dbm")
40 let nuprl_dbm       = lazy (Helm_registry.get "getter.nuprl_dbm")
41 let rdf_dbm         = lazy (Helm_registry.get "getter.rdf_dbm")
42 let xsl_dbm         = lazy (Helm_registry.get "getter.xsl_dbm")
43 let xml_index       = lazy (Helm_registry.get "getter.xml_indexname")
44 let rdf_index       = lazy (Helm_registry.get "getter.rdf_indexname")
45 let xsl_index       = lazy (Helm_registry.get "getter.xsl_indexname")
46 let cic_dir         = lazy (Helm_registry.get "getter.cic_dir")
47 let nuprl_dir       = lazy (Helm_registry.get "getter.nuprl_dir")
48 let rdf_dir         = lazy (Helm_registry.get "getter.rdf_dir")
49 let dtd_dir         = lazy (Helm_registry.get "getter.dtd_dir")
50 let dtd_base_url    = lazy (Helm_registry.get "getter.dtd_base_url")
51 let port            = lazy (Helm_registry.get_int "getter.port")
52
53 let _servers = ref None
54
55 let servers =
56   lazy
57     (match !_servers with
58     | None -> failwith "Getter not yet initialized: servers not available"
59     | Some servers -> servers)
60
61 let load_servers () =
62   let pos = ref (-1) in
63   List.rev (Http_getter_misc.fold_file
64     (fun line servers ->
65       if Http_getter_misc.is_blank_line line then
66         servers
67       else
68         (incr pos; (!pos, line) :: servers))
69     []
70     (Lazy.force servers_file))
71
72 let reload_servers () = _servers := Some (load_servers ())
73
74 let save_servers () =
75   let oc = open_out (Lazy.force servers_file) in
76   List.iter (fun (_,server) -> output_string oc (server ^ "\n"))
77     (Lazy.force servers);
78   close_out oc
79
80 let host =
81   lazy
82     (let buf = Buffer.create 20 in
83     Shell.call ~stdout:(Shell.to_buffer buf) [Shell.cmd "hostname" ["-f"]];
84     Pcre.replace ~pat:"\n+$" (Buffer.contents buf))
85
86 let my_own_url =
87   lazy
88     (let (host, port) = (Lazy.force host, Lazy.force port) in
89     sprintf "http://%s%s" (* without trailing '/' *)
90     host (if port = 80 then "" else (sprintf ":%d" port)))
91
92 let cache_mode =
93   lazy
94     (match String.lowercase (Helm_registry.get "getter.cache_mode") with
95     | "normal" -> Enc_normal
96     | "gz" -> Enc_gzipped
97     | mode -> failwith ("Invalid cache mode: " ^ mode))
98
99 let reload () = reload_servers ()
100
101 let env_to_string () =
102   sprintf
103 "HTTP Getter %s (the OCaml one!)
104
105 cic_dbm:\t%s
106 nuprl_dbm:\t%s
107 rdf_dbm:\t%s
108 xsl_dbm:\t%s
109 xml_index:\t%s
110 rdf_index:\t%s
111 xsl_index:\t%s
112 cic_dir:\t%s
113 nuprl_dir:\t%s
114 rdf_dir:\t%s
115 dtd_dir:\t%s
116 servers_file:\t%s
117 host:\t\t%s
118 port:\t\t%d
119 my_own_url:\t%s
120 dtd_base_url:\t%s
121 cache_mode:\t%s
122 servers:
123 \t%s
124 "
125     version (Lazy.force cic_dbm) (Lazy.force nuprl_dbm) (Lazy.force rdf_dbm)
126     (Lazy.force xsl_dbm) (Lazy.force xml_index)
127     (Lazy.force rdf_index) (Lazy.force xsl_index) (Lazy.force cic_dir)
128     (Lazy.force nuprl_dir) (Lazy.force rdf_dir)
129     (Lazy.force dtd_dir) (Lazy.force servers_file) (Lazy.force host)
130     (Lazy.force port) (Lazy.force my_own_url)
131     (Lazy.force dtd_base_url)
132     (match Lazy.force cache_mode with Enc_normal -> "Normal" | Enc_gzipped -> "GZipped")
133     (String.concat "\n\t" (* (position * server) list *)
134       (List.map (fun (pos, server) -> sprintf "%3d: %s" pos server)
135         (Lazy.force servers)))
136
137 let add_server ?position url =
138   let new_servers =
139     let servers = Lazy.force servers in
140     match position with
141     | None -> servers @ [-1, url];
142     | Some p when p > 0 ->
143         let rec add_after pos = function
144           | [] -> [-1, url]
145           | hd :: tl when p = 1 -> hd :: (-1, url) :: tl
146           | hd :: tl (* when p > 1 *) -> hd :: (add_after (pos - 1) tl)
147         in
148         add_after p servers
149     | Some _ -> assert false
150   in
151   _servers := Some new_servers;
152   save_servers ();
153   reload_servers ()
154
155 let remove_server position =
156   _servers := Some (List.remove_assoc position (Lazy.force servers));
157   save_servers ();
158   reload_servers ()
159