(* $Id$ *)

(** {1 Netplex support for FastCGI, SCGI and AJP connectors} *)

(** {2 Factory} *)

open Netcgi

val factory :
      ?config:config ->
      ?enable:[ `FCGI | `SCGI | `AJP ] list ->
      ?name:string ->
      ?output_type:output_type ->
      ?arg_store:arg_store ->
      ?exn_handler:exn_handler ->
      ?configure:(Netplex_types.config_file -> 
                  Netplex_types.address ->
		    Netplex_types.processor_hooks) ->
      (Netplex_types.container -> cgi -> unit) ->
        Netplex_types.processor_factory
  (** Reads a Netplex configuration section like
    * {[
    *    processor {
    *      type = "netcgi";          (* or the overridden [name] *)
    *      timeout = 15;             (* optional *)
    *      mount_dir = "/url/path";  (* optional *)
    *      mount_at = "/url/path";   (* optional alternative to mount_dir *)
    *    }
    * ]}
    *
    * and creates a processor for the protocols "fcgi", "scgi",
    * and "ajp" (or a subset of these protocols if the [enable] 
    * parameter restricts them). A complete service definition
    * looks thus like:
    *
    * {[
    *      service {
    *          name = "name_of_service";
    *          protocol {
    *              name = "fcgi";        (* or "scgi" or "ajp" *)
    *              address {
    *                  type = "internet";
    *                  bind = "localhost:<port>";
    *              };
    *          };
    *          (* ... several protocol sections allowed! *)
    *          processor {
    *              type = "netcgi";
    *          };
    *          workload_manager {
    *              type = "dynamic";
    *              max_jobs_per_thread = 1;  (* only reasonable value *)
    *              min_free_job_capacity = <n>;
    *              max_free_job_capacity = <n>;
    *              max_threads = <n>;
    *          };
    *      }
    * ]}
    *
    * The processor calls the argument function of type [container -> cgi -> unit]
    * for every incoming request.
    *
    * The [timeout] parameter specifies when inactive connections are
    * timed out (in seconds). The [mount_dir] and [mount_at] parameters
    * define which part of the URL is considered as [SCRIPT_NAME]:
    *
    * - By default (if neither [mount_dir] nor [mount_at]) are given
    *   [SCRIPT_NAME] is determined in a protocol-dependent way. Usually,
    *   the server transmits [SCRIPT_NAME], but see the note below.
    * - If [mount_dir] is present, the processor accepts only URLs
    *   that have this path as true prefix directory, i.e. the URL path
    *   is [<mount_dir>/<name><rest>]. The part [<mount_dir>/<name>]
    *   is taken as [SCRIPT_NAME].
    * - If [mount_at] is present, the processor accepts only URLs
    *   that have this path as prefix, i.e. the URL path is
    *   [<mount_at><rest>]. [<mount_at>] is taken as [SCRIPT_NAME].
    *
    * The background is that [SCRIPT_NAME] is commonly used to
    * distinghuish between different web actions of the netcgi
    * application. The actions are simply names in a directory like
    * [/bin/<name>] or [/servlet/<name>]. Not all web servers/protocols
    * transmit good values for [SCRIPT_NAME], however. By specifying
    * [mount_dir] or [mount_at] one can force to interpret a certain
    * prefix of the request URL as [SCRIPT_NAME].
    *
    * @param config The Netcgi configuration to use, default is
    *    {!Netcgi.default_config}
    * @param enable Which protocols to support. Default is to
    *    support all protocols
    * @param name Defines the name of the processor. Default is "netcgi".
    * @param output_type Default: [`Direct ""]
    * @param arg_store Default: [`Automatic] for all arguments.
    * @param exn_handler See {!Netcgi.exn_handler}.  Default: delegate
    *      all exceptions to the default handler.
    * @param configure Parameters are the netplex configuration file
    *     and the address of the [processor] section. The configure
    *     function can look for additional parameters. It returns
    *     service hooks that are added to the resulting processor.
   *)


(** {2 Processors} *)

(** The following functions create the processors directly *)

type mountpoint =
    [ `Mount_dir of string
    | `Mount_at of string
    ]

val fcgi_processor : 
      ?config:config ->
      ?output_type:output_type ->
      ?arg_store:arg_store ->
      ?exn_handler:exn_handler ->
      ?timeout:float ->
      ?mount:mountpoint ->
      (Netplex_types.container -> Netcgi_fcgi.cgi -> unit) ->
        Netplex_types.processor

val scgi_processor :
      ?config:config ->
      ?output_type:output_type ->
      ?arg_store:arg_store ->
      ?exn_handler:exn_handler ->
      ?timeout:float ->
      ?mount:mountpoint ->
      (Netplex_types.container -> cgi -> unit) ->
        Netplex_types.processor

val ajp_processor :
      ?config:config ->
      ?output_type:output_type ->
      ?arg_store:arg_store ->
      ?exn_handler:exn_handler ->
      ?timeout:float ->
      ?mount:mountpoint ->
      (Netplex_types.container -> cgi -> unit) ->
        Netplex_types.processor
