# Class Netcgi_common.cgi_environment

    class cgi_environment : config:config -> properties:(string * string) list -> input_header:(string * string) list -> Netchannels.out_obj_channel -> object .. end

`new cgi_environment ~config ~properties ~input_header out_obj` generates a `Netcgi.cgi_environment` object, from the arguments. The creation of such an object does not raise any exception. The method `#out_channel` of the created environment returns `out_obj`.

`config` : give the configuration options. Of particular interest here is `config.workarounds`. If ``MSIE_Content_type_bug` is present, a fix will be applied to `input_header`.
`properties` : CGI-like properties as (name, value) pairs. Examples: `("REQUEST_METHOD", "POST")`, `("SERVER_PROTOCOL", "HTTP/1.1")`. Note that "CONTENT_TYPE" and "CONTENT_LENGTH" are part of the input header. It is highly recommended to use `Netcgi_common.update_props_inheader` to build this list.
`input_header` : is a list of (field, value) pairs of the HTTP input request. It is ASSUMED that field names in `input_header` are lowercase in order to apply a fix to the MSIE Content-Type bug. Also remember that the separator is '-', not '_'. Both requirements will be stafisfied if you use `Netcgi_common.update_props_inheader` to build `input_header`. Notes: The header is kept into variables and `#send_output_header` sents it directly to `out_obj`. This has several advantages:

- It is possible to change header fields at every moment before the commitment happens. For example, it is possible to set the content-length field which is normally only known just at the time of the commit operation.

- The `environment` object can process the header; for example it can fix header fields.

- It is simpler to connect to environments which transport the header in non-standard ways. Example: Assume that the environment is the web server process (e.g. we are an Apache module). Typically the header must be stored in different structures than the body of the message.

    val mutable header_not_sent : bool

`true` iff the output headers have not been sent. `#send_output_header` must set it to false once it did its job.

    method cgi_gateway_interface : string

    method cgi_server_name : string

    method cgi_server_port : int option

    method cgi_server_protocol : string

    method cgi_server_software : string

    method cgi_request_method : string

    method cgi_script_name : string

    method cgi_path_info : string

    method cgi_path_translated : string

    method cgi_auth_type : string

    method cgi_remote_addr : string

    method cgi_remote_host : string

    method cgi_remote_user : string

    method cgi_remote_ident : string

    method cgi_query_string : string

    method protocol : Nethttp.protocol

    method cgi_property : ?default:string -> string -> string

    method cgi_properties : (string * string) list

Return the parameter `properties`.

    method cgi_https : bool

- Raises `HTTP` if the HTTPS property is not understood.

    method input_header : Netmime.mime_header

For special header structures, just override this method.

    method input_header_field : ?default:string -> string -> string

    method multiple_input_header_field : string -> string list

    method input_header_fields : (string * string) list

    method cookie : string -> Cookie.t

    method cookies : Cookie.t list

    method user_agent : string

    method input_content_length : int

    method input_content_type_string : string

    method input_content_type : unit -> string * (string * Netmime_string.s_param) list

    method output_header : Netmime.mime_header

For special header structures, override this method and maybe `#send_output_header`.

    method output_header_field : ?default:string -> string -> string

    method multiple_output_header_field : string -> string list

    method output_header_fields : (string * string) list

    method set_output_header_field : string -> string -> unit

    method set_multiple_output_header_field : string -> string list -> unit

    method set_output_header_fields : (string * string) list -> unit

    method set_status : Nethttp.http_status -> unit

    method send_output_header : unit -> unit

    method output_ch : Netchannels.out_obj_channel

Deprecated.Use `#out_channel` instead.

    method out_channel : Netchannels.out_obj_channel

    method log_error : string -> unit

You may want to override this with your custom logging method. By default, `#log_error msg` adds a timestamp to `msg` and sends th result to `stderr`.

    method config : config