(*
* <COPYRIGHT>
* Copyright 2002 Joachim Schrod Network and Publication Consultance GmbH, Gerd Stolpmann
*
* <GPL>
* This file is part of WDialog.
*
* WDialog 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.
*
* WDialog 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 WDialog; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* </>
*)
(* $Id: wd_run_cgi.ml,v 3.6 2003-01-15 23:04:47 stolpmann Exp $
* ----------------------------------------------------------------------
*
*)
open Wd_types
open Netcgi
open Netchannels
let adjust_gc () =
let gc = Gc.get() in
gc.Gc.space_overhead <- 100;
gc.Gc.minor_heap_size <- 256 * 1024;
Gc.set gc
;;
let print_error (ch:out_obj_channel) exc =
let s = Printexc.to_string exc in
let out = ch # output_string in
out "<html><body><h1>Software error</h1>\n";
out "<tt>";
out (Netencoding.Html.encode_from_latin1 s);
out "</tt></body></html>\n"
;;
let processing name hdr =
`Automatic
;;
let operating_type =
`Transactional
(fun _ ch ->
new Netchannels.buffered_trans_channel ch)
let run
?(charset = `Enc_iso88591)
?script
?self_url
?uifile
?session_manager
?(no_cache = true)
?(error_page = print_error)
?cgi_config
?(output_type = operating_type)
?response_header
?(reg = (fun _ -> ()))
() =
Netcgi_cgi.run
?config:cgi_config
~output_type
(fun cgi ->
begin try
let suggested_script_file_name, suggested_url =
match script with
None ->
let script_path =
cgi # environment # cgi_script_name in
let b = Filename.basename script_path in
if b = "" then "index.cgi", "" else b, b
| Some s ->
s, Filename.basename s
in
let url =
match self_url with
None ->
"./" ^ suggested_url
| Some u ->
u
in
let ui_file_name =
match uifile with
None ->
( try
Filename.chop_extension suggested_script_file_name ^ ".ui"
with _ ->
"index.ui"
)
| Some f ->
f
in
(* Load the UI term: *)
let ui_compiled_file_name =
Filename.chop_extension ui_file_name ^ ".ui.bin" in
let app =
if Sys.file_exists ui_compiled_file_name then
Wd_transform.load_uiapplication ~charset ui_compiled_file_name
else
Wd_transform.parse_uiapplication ~charset ui_file_name
in
let cache =
match cgi # request_method with
`GET -> `No_cache
| `POST -> if no_cache then `No_cache else `Unspecified
| _ -> assert false
in
let charset_s =
Netconversion.string_of_encoding (charset :> Netconversion.encoding) in
let response_header =
match response_header with
None -> { rh_status = `Ok;
rh_content_type = "text/html; charset=" ^ charset_s;
(* Note: Some browsers (e.g. Mozilla-0.9.6) do not like
* quotes around charset
*)
rh_cache = cache;
rh_filename = None;
rh_language = None;
rh_script_type = None;
rh_style_type = None;
rh_set_cookie = [];
rh_fields = [];
}
| Some rh -> rh
in
let universe = new Wd_universe.universe app in
reg universe;
Wd_cycle.process_request ?session_manager ~self_url:url ~response_header
universe cgi;
with
exc ->
cgi # output # rollback_work();
cgi # set_header ~status:`Internal_server_error ~cache:`No_cache ();
error_page (cgi#output :> out_obj_channel) exc;
(* may raise another exception! *)
end;
cgi # output # commit_work();
cgi # finalize()
)
;;
(* ======================================================================
* History:
*
* $Log: wd_run_cgi.ml,v $
* Revision 3.6 2003-01-15 23:04:47 stolpmann
* New option ~uifile
*
* Revision 3.5 2003/01/04 21:55:25 stolpmann
* new record response_header
*
* Revision 3.4 2002/03/19 22:09:29 stolpmann
* Using `Automatic.
*
* Revision 3.3 2002/02/26 16:01:12 stolpmann
* Fix: Error pages are not cached.
*
* Revision 3.2 2002/02/14 16:15:21 stolpmann
* Added copyright notice.
*
* Revision 3.1 2002/02/12 20:29:20 stolpmann
* Initial release at sourceforge.
*
* Revision 1.6 2002/02/06 00:14:00 gerd
* Updates to ocamlnet-0.92
*
* Revision 1.5 2002/02/05 18:43:55 gerd
* It is now possible to pass the session_manager
*
* Revision 1.4 2002/01/30 15:14:10 gerd
* New: ~charset
*
* Revision 1.3 2002/01/14 15:03:24 gerd
* Major change: Typing has been completely revised, and almost
* every tiny thing has now a new type. Also renamed a lot.
*
* Revision 1.2 2000/12/06 15:26:47 gerd
* Support for the ~self_url argument.
*
* Revision 1.1 2000/11/30 18:29:07 gerd
* Initial revision
*
*)