(* * Copyright (C) 2003-2004: * Stefano Zacchiroli * for the HELM Team http://helm.cs.unibo.it/ * * This file is part of HELM, an Hypertextual, Electronic * Library of Mathematics, developed at the Computer Science * Department, University of Bologna, Italy. * * HELM is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * HELM is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HELM; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. * * For details, see the HELM World-Wide-Web page, * http://helm.cs.unibo.it/ *) open Printf open Pxp_document open Pxp_types open Pxp_yacc open Http_getter_types let version = Http_getter_const.version let servers_file = lazy (Helm_registry.get "getter.servers_file") let cic_dbm = lazy (Helm_registry.get "getter.cic_dbm") let nuprl_dbm = lazy (Helm_registry.get "getter.nuprl_dbm") let rdf_dbm = lazy (Helm_registry.get "getter.rdf_dbm") let xsl_dbm = lazy (Helm_registry.get "getter.xsl_dbm") let xml_index = lazy (Helm_registry.get "getter.xml_indexname") let rdf_index = lazy (Helm_registry.get "getter.rdf_indexname") let xsl_index = lazy (Helm_registry.get "getter.xsl_indexname") let cic_dir = lazy (Helm_registry.get "getter.cic_dir") let nuprl_dir = lazy (Helm_registry.get "getter.nuprl_dir") let rdf_dir = lazy (Helm_registry.get "getter.rdf_dir") let dtd_dir = lazy (Helm_registry.get "getter.dtd_dir") let dtd_base_url = lazy (Helm_registry.get "getter.dtd_base_url") let port = lazy (Helm_registry.get_int "getter.port") let _servers = ref None let servers = function () -> (match !_servers with | None -> failwith "Getter not yet initialized: servers not available" | Some servers -> servers) let load_servers () = let pos = ref (-1) in List.rev (Http_getter_misc.fold_file (fun line servers -> if Http_getter_misc.is_blank_line line then servers else (incr pos; (!pos, line) :: servers)) [] (Lazy.force servers_file)) let reload_servers () = _servers := Some (load_servers ()) let save_servers () = let oc = open_out (Lazy.force servers_file) in List.iter (fun (_,server) -> output_string oc (server ^ "\n")) (servers ()); close_out oc let host = lazy (let buf = Buffer.create 20 in Shell.call ~stdout:(Shell.to_buffer buf) [Shell.cmd "hostname" ["-f"]]; Pcre.replace ~pat:"\n+$" (Buffer.contents buf)) let my_own_url = lazy (let (host, port) = (Lazy.force host, Lazy.force port) in sprintf "http://%s%s" (* without trailing '/' *) host (if port = 80 then "" else (sprintf ":%d" port))) let cache_mode = lazy (match String.lowercase (Helm_registry.get "getter.cache_mode") with | "normal" -> Enc_normal | "gz" -> Enc_gzipped | mode -> failwith ("Invalid cache mode: " ^ mode)) let reload () = reload_servers () let env_to_string () = sprintf "HTTP Getter %s (the OCaml one!) cic_dbm:\t%s nuprl_dbm:\t%s rdf_dbm:\t%s xsl_dbm:\t%s xml_index:\t%s rdf_index:\t%s xsl_index:\t%s cic_dir:\t%s nuprl_dir:\t%s rdf_dir:\t%s dtd_dir:\t%s servers_file:\t%s host:\t\t%s port:\t\t%d my_own_url:\t%s dtd_base_url:\t%s cache_mode:\t%s servers: \t%s " version (Lazy.force cic_dbm) (Lazy.force nuprl_dbm) (Lazy.force rdf_dbm) (Lazy.force xsl_dbm) (Lazy.force xml_index) (Lazy.force rdf_index) (Lazy.force xsl_index) (Lazy.force cic_dir) (Lazy.force nuprl_dir) (Lazy.force rdf_dir) (Lazy.force dtd_dir) (Lazy.force servers_file) (Lazy.force host) (Lazy.force port) (Lazy.force my_own_url) (Lazy.force dtd_base_url) (match Lazy.force cache_mode with Enc_normal -> "Normal" | Enc_gzipped -> "GZipped") (String.concat "\n\t" (* (position * server) list *) (List.map (fun (pos, server) -> sprintf "%3d: %s" pos server) (servers ()))) let add_server ?position url = let new_servers = let servers = servers () in match position with | None -> servers @ [-1, url]; | Some p when p > 0 -> let rec add_after pos = function | [] -> [-1, url] | hd :: tl when p = 1 -> hd :: (-1, url) :: tl | hd :: tl (* when p > 1 *) -> hd :: (add_after (pos - 1) tl) in add_after p servers | Some 0 -> (-1, url)::servers | Some _ -> assert false in _servers := Some new_servers; save_servers (); reload_servers () let remove_server position = _servers := Some (List.remove_assoc position (servers ())); save_servers (); reload_servers ()