(* netcgi_scgi.mli

   Copyright (C) 2005-2006

     Christophe Troestler
     email: Christophe.Troestler@umh.ac.be
     WWW: http://math.umh.ac.be/an/

   This library is free software; see the file LICENSE for more information.

   This library 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 file
   LICENSE for more details.
*)

(** SCGI connector.

    The {{:http://www.mems-exchange.org/software/scgi/}SCGI} connects
    your web applications through a TCP/IP socket (thus the application
    can run on a machine different from the web server).

    See the {!Netcgi_scgi.setup} section at the end of this file to know
    how to configure your web server.  *)

open Netcgi

val run :
  ?config:config ->
  ?allow:(Unix.sockaddr -> bool) ->
  ?output_type:output_type ->
  ?arg_store:arg_store ->
  ?exn_handler:exn_handler ->
  ?socket:Unix.file_descr ->
  ?sockaddr:Unix.sockaddr ->
  ?port:int ->
  (cgi -> unit) -> unit
  (** [run f] executes [f cgi] for each SCGI request.

      @param config Default: {!Netcgi.default_config}
      @param allow Tells whether a connection from the socket is allowed.
        Default: allow from all.
      @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 socket is a listening socket to use. Overrides [sockaddr]
        and [port]
      @param sockaddr The sockaddr for listening. Overrides [port]
      @param port The port for listening. Needs to be specified if no
        [sockaddr] is passed.

*)

val handle_request :
  config -> output_type -> arg_store -> exn_handler ->
  (cgi -> unit) -> log:(string -> unit) option ->
  Unix.file_descr -> 
    connection_directive
  (** [handle_request config output_type arg_store eh f ~log fd]:
      This is a 
      lower-level interface that processes exactly one request arriving 
      on the existing connection [fd].

      [log] is the error logger function or [None], in which case 
      errors are passed through to the FCGI client.

      The other arguments are just like for [run].

      The return value indicates whether the connection can be kept
      open or must be closed.
   *)

val handle_connection :
  config -> output_type -> arg_store -> exn_handler ->
  (cgi -> unit) -> Unix.file_descr ->
    unit
    (** [handle_connection config output_type arg_store eh f ?script_name fd]:
        This is a lower-level interface that processes
        exactly one connection [fd]. The descriptor is closed (even on
        error).

        The other arguments are just like for [run].
    *)


(* ---------------------------------------------------------------------- *)

(** {2:setup Setup}


    Add to httpd.conf or to, say, scgi.conf in /etc/apache/conf.d
    {[
    LoadModule scgi_module /usr/lib/apache/1.3/mod_scgi.so
    # Serve the URL /scgi by contacting 127.0.0.1 on port 8888
    SCGIMount /scgi 127.0.0.1:8888
    ]}

*)
