File: Netcgi.html

package info (click to toggle)
ocamlnet 2.2.9-8
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 17,724 kB
  • ctags: 10,053
  • sloc: ml: 63,928; ansic: 1,973; makefile: 800; sh: 651
file content (482 lines) | stat: -rw-r--r-- 30,171 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<link rel="Start" href="index.html">
<link rel="previous" href="Netcgi_common.html">
<link rel="next" href="Netcgi_ajp.html">
<link rel="Up" href="index.html">
<link title="Index of types" rel=Appendix href="index_types.html">
<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
<link title="Index of values" rel=Appendix href="index_values.html">
<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
<link title="Index of class methods" rel=Appendix href="index_methods.html">
<link title="Index of classes" rel=Appendix href="index_classes.html">
<link title="Index of class types" rel=Appendix href="index_class_types.html">
<link title="Index of modules" rel=Appendix href="index_modules.html">
<link title="Index of module types" rel=Appendix href="index_module_types.html">
<link title="Uq_gtk" rel="Chapter" href="Uq_gtk.html">
<link title="Equeue" rel="Chapter" href="Equeue.html">
<link title="Unixqueue" rel="Chapter" href="Unixqueue.html">
<link title="Uq_engines" rel="Chapter" href="Uq_engines.html">
<link title="Uq_socks5" rel="Chapter" href="Uq_socks5.html">
<link title="Unixqueue_mt" rel="Chapter" href="Unixqueue_mt.html">
<link title="Equeue_intro" rel="Chapter" href="Equeue_intro.html">
<link title="Uq_ssl" rel="Chapter" href="Uq_ssl.html">
<link title="Uq_tcl" rel="Chapter" href="Uq_tcl.html">
<link title="Netcgi_common" rel="Chapter" href="Netcgi_common.html">
<link title="Netcgi" rel="Chapter" href="Netcgi.html">
<link title="Netcgi_ajp" rel="Chapter" href="Netcgi_ajp.html">
<link title="Netcgi_scgi" rel="Chapter" href="Netcgi_scgi.html">
<link title="Netcgi_cgi" rel="Chapter" href="Netcgi_cgi.html">
<link title="Netcgi_fcgi" rel="Chapter" href="Netcgi_fcgi.html">
<link title="Netcgi_dbi" rel="Chapter" href="Netcgi_dbi.html">
<link title="Netcgi1_compat" rel="Chapter" href="Netcgi1_compat.html">
<link title="Netcgi_test" rel="Chapter" href="Netcgi_test.html">
<link title="Netcgi_porting" rel="Chapter" href="Netcgi_porting.html">
<link title="Netcgi_plex" rel="Chapter" href="Netcgi_plex.html">
<link title="Http_client" rel="Chapter" href="Http_client.html">
<link title="Telnet_client" rel="Chapter" href="Telnet_client.html">
<link title="Ftp_data_endpoint" rel="Chapter" href="Ftp_data_endpoint.html">
<link title="Ftp_client" rel="Chapter" href="Ftp_client.html">
<link title="Nethttpd_types" rel="Chapter" href="Nethttpd_types.html">
<link title="Nethttpd_kernel" rel="Chapter" href="Nethttpd_kernel.html">
<link title="Nethttpd_reactor" rel="Chapter" href="Nethttpd_reactor.html">
<link title="Nethttpd_engine" rel="Chapter" href="Nethttpd_engine.html">
<link title="Nethttpd_services" rel="Chapter" href="Nethttpd_services.html">
<link title="Nethttpd_plex" rel="Chapter" href="Nethttpd_plex.html">
<link title="Nethttpd_intro" rel="Chapter" href="Nethttpd_intro.html">
<link title="Netplex_types" rel="Chapter" href="Netplex_types.html">
<link title="Netplex_mp" rel="Chapter" href="Netplex_mp.html">
<link title="Netplex_mt" rel="Chapter" href="Netplex_mt.html">
<link title="Netplex_log" rel="Chapter" href="Netplex_log.html">
<link title="Netplex_controller" rel="Chapter" href="Netplex_controller.html">
<link title="Netplex_container" rel="Chapter" href="Netplex_container.html">
<link title="Netplex_sockserv" rel="Chapter" href="Netplex_sockserv.html">
<link title="Netplex_workload" rel="Chapter" href="Netplex_workload.html">
<link title="Netplex_main" rel="Chapter" href="Netplex_main.html">
<link title="Netplex_config" rel="Chapter" href="Netplex_config.html">
<link title="Netplex_kit" rel="Chapter" href="Netplex_kit.html">
<link title="Rpc_netplex" rel="Chapter" href="Rpc_netplex.html">
<link title="Netplex_cenv" rel="Chapter" href="Netplex_cenv.html">
<link title="Netplex_intro" rel="Chapter" href="Netplex_intro.html">
<link title="Netshm" rel="Chapter" href="Netshm.html">
<link title="Netshm_data" rel="Chapter" href="Netshm_data.html">
<link title="Netshm_hashtbl" rel="Chapter" href="Netshm_hashtbl.html">
<link title="Netshm_array" rel="Chapter" href="Netshm_array.html">
<link title="Netshm_intro" rel="Chapter" href="Netshm_intro.html">
<link title="Netconversion" rel="Chapter" href="Netconversion.html">
<link title="Netchannels" rel="Chapter" href="Netchannels.html">
<link title="Netstream" rel="Chapter" href="Netstream.html">
<link title="Mimestring" rel="Chapter" href="Mimestring.html">
<link title="Netmime" rel="Chapter" href="Netmime.html">
<link title="Netsendmail" rel="Chapter" href="Netsendmail.html">
<link title="Neturl" rel="Chapter" href="Neturl.html">
<link title="Netaddress" rel="Chapter" href="Netaddress.html">
<link title="Netbuffer" rel="Chapter" href="Netbuffer.html">
<link title="Netdate" rel="Chapter" href="Netdate.html">
<link title="Netencoding" rel="Chapter" href="Netencoding.html">
<link title="Netulex" rel="Chapter" href="Netulex.html">
<link title="Netaccel" rel="Chapter" href="Netaccel.html">
<link title="Netaccel_link" rel="Chapter" href="Netaccel_link.html">
<link title="Nethtml" rel="Chapter" href="Nethtml.html">
<link title="Netstring_str" rel="Chapter" href="Netstring_str.html">
<link title="Netstring_pcre" rel="Chapter" href="Netstring_pcre.html">
<link title="Netstring_mt" rel="Chapter" href="Netstring_mt.html">
<link title="Netmappings" rel="Chapter" href="Netmappings.html">
<link title="Netaux" rel="Chapter" href="Netaux.html">
<link title="Nethttp" rel="Chapter" href="Nethttp.html">
<link title="Netchannels_tut" rel="Chapter" href="Netchannels_tut.html">
<link title="Netmime_tut" rel="Chapter" href="Netmime_tut.html">
<link title="Netsendmail_tut" rel="Chapter" href="Netsendmail_tut.html">
<link title="Netulex_tut" rel="Chapter" href="Netulex_tut.html">
<link title="Neturl_tut" rel="Chapter" href="Neturl_tut.html">
<link title="Netsys" rel="Chapter" href="Netsys.html">
<link title="Netpop" rel="Chapter" href="Netpop.html">
<link title="Rpc_auth_dh" rel="Chapter" href="Rpc_auth_dh.html">
<link title="Rpc_key_service" rel="Chapter" href="Rpc_key_service.html">
<link title="Rpc_time" rel="Chapter" href="Rpc_time.html">
<link title="Rpc_auth_local" rel="Chapter" href="Rpc_auth_local.html">
<link title="Rtypes" rel="Chapter" href="Rtypes.html">
<link title="Xdr" rel="Chapter" href="Xdr.html">
<link title="Rpc" rel="Chapter" href="Rpc.html">
<link title="Rpc_program" rel="Chapter" href="Rpc_program.html">
<link title="Rpc_portmapper_aux" rel="Chapter" href="Rpc_portmapper_aux.html">
<link title="Rpc_packer" rel="Chapter" href="Rpc_packer.html">
<link title="Rpc_transport" rel="Chapter" href="Rpc_transport.html">
<link title="Rpc_client" rel="Chapter" href="Rpc_client.html">
<link title="Rpc_simple_client" rel="Chapter" href="Rpc_simple_client.html">
<link title="Rpc_portmapper_clnt" rel="Chapter" href="Rpc_portmapper_clnt.html">
<link title="Rpc_portmapper" rel="Chapter" href="Rpc_portmapper.html">
<link title="Rpc_server" rel="Chapter" href="Rpc_server.html">
<link title="Rpc_auth_sys" rel="Chapter" href="Rpc_auth_sys.html">
<link title="Rpc_intro" rel="Chapter" href="Rpc_intro.html">
<link title="Rpc_mapping_ref" rel="Chapter" href="Rpc_mapping_ref.html">
<link title="Rpc_ssl" rel="Chapter" href="Rpc_ssl.html">
<link title="Rpc_xti_client" rel="Chapter" href="Rpc_xti_client.html">
<link title="Shell_sys" rel="Chapter" href="Shell_sys.html">
<link title="Shell" rel="Chapter" href="Shell.html">
<link title="Shell_uq" rel="Chapter" href="Shell_uq.html">
<link title="Shell_mt" rel="Chapter" href="Shell_mt.html">
<link title="Shell_intro" rel="Chapter" href="Shell_intro.html">
<link title="Netsmtp" rel="Chapter" href="Netsmtp.html"><link title="Arguments" rel="Section" href="#2_Arguments">
<link title="Cookies" rel="Section" href="#2_Cookies">
<link title="The environment of a request" rel="Section" href="#2_Theenvironmentofarequest">
<link title="CGI object" rel="Section" href="#2_CGIobject">
<link title="Connectors" rel="Section" href="#2_Connectors">
<title>Ocamlnet 2 Reference Manual : Netcgi</title>
</head>
<body>
<div class="navbar"><a href="Netcgi_common.html">Previous</a>
&nbsp;<a href="index.html">Up</a>
&nbsp;<a href="Netcgi_ajp.html">Next</a>
</div>
<center><h1>Module <a href="type_Netcgi.html">Netcgi</a></h1></center>
<br>
<pre><span class="keyword">module</span> Netcgi: <code class="code">sig</code> <a href="Netcgi.html">..</a> <code class="code">end</code></pre>Common data-structures for CGI-like connectors.
<p>

 This library tries to minimize the use of unsafe practices.  It
 cannot be bullet proof however and you should read about
 <a href="http://www.w3.org/Security/Faq/wwwsf4.html">security</a>.
<p>

 REMARK: It happens frequently that hard to predict random numbers
 are needed in Web applications.  The previous version of this
 library used to include some facilities for that (in the
 <code class="code">Netcgi_jserv</code> module).  They have been dropped in favor of
 <a href="http://pauillac.inria.fr/~xleroy/software.html#cryptokit">Cryptokit</a>.<br>
<hr width="100%">
<br>
<a name="2_Arguments"></a>
<h2>Arguments</h2><br>
<pre><span class="keyword">class type</span> <a name="TYPEcgi_argument"></a><a href="Netcgi.cgi_argument.html">cgi_argument</a> = <code class="code">object</code> <a href="Netcgi.cgi_argument.html">..</a> <code class="code">end</code></pre><div class="info">
Represent a key-value pair of data passed to the script (including
    file uploads).
</div>
<pre><span class="keyword">module</span> <a href="Netcgi.Argument.html">Argument</a>: <code class="code">sig</code> <a href="Netcgi.Argument.html">..</a> <code class="code">end</code></pre><div class="info">
Operations on arguments and lists of thereof.
</div>
<pre><span class="keyword">class type</span> <a name="TYPErw_cgi_argument"></a><a href="Netcgi.rw_cgi_argument.html">rw_cgi_argument</a> = <code class="code">object</code> <a href="Netcgi.rw_cgi_argument.html">..</a> <code class="code">end</code></pre><div class="info">
<font color="#CCCCCC">Old deprecated writable argument type.
</font></div>
<pre><span class="keyword">class</span> <a name="TYPEsimple_argument"></a><a href="Netcgi.simple_argument.html">simple_argument</a> : <code class="type">?ro:bool -> string -> string -> </code><code class="type"><a href="Netcgi.rw_cgi_argument.html">rw_cgi_argument</a></code></pre><div class="info">
<font color="#CCCCCC">Old deprecated simple argument class.
</font></div>
<pre><span class="keyword">class</span> <a name="TYPEmime_argument"></a><a href="Netcgi.mime_argument.html">mime_argument</a> : <code class="type">?work_around_backslash_bug:bool -> string -> <a href="Netmime.html#TYPEmime_message">Netmime.mime_message</a> -> </code><code class="type"><a href="Netcgi.rw_cgi_argument.html">rw_cgi_argument</a></code></pre><div class="info">
<font color="#CCCCCC">Old deprecated MIME argument class.
</font></div>
<br>
<a name="2_Cookies"></a>
<h2>Cookies</h2><br>
<pre><span class="keyword">module</span> <a href="Netcgi.Cookie.html">Cookie</a>: <code class="code">sig</code> <a href="Netcgi.Cookie.html">..</a> <code class="code">end</code></pre><div class="info">
Functions to manipulate cookies.
</div>
<br>
<a name="2_Theenvironmentofarequest"></a>
<h2>The environment of a request</h2><br>
<pre><span class="keyword">type</span> <a name="TYPEconfig"></a><code class="type"></code>config = <code class="type"><a href="Netcgi_common.html#TYPEconfig">Netcgi_common.config</a></code> = {</pre><table class="typetable">
<tr>
<td align="left" valign="top" >
<code>&nbsp;&nbsp;</code></td>
<td align="left" valign="top" >
<code>tmp_directory&nbsp;: <code class="type">string</code>;</code></td>
<td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >The directory where to create temporary files.  This should be
      an absolute path name.</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code>&nbsp;&nbsp;</code></td>
<td align="left" valign="top" >
<code>tmp_prefix&nbsp;: <code class="type">string</code>;</code></td>
<td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >The name prefix for temporary files. This must be a non-empty
      string. It must not contain '/'.</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code>&nbsp;&nbsp;</code></td>
<td align="left" valign="top" >
<code>permitted_http_methods&nbsp;: <code class="type">[ `DELETE | `GET | `HEAD | `POST | `PUT ] list</code>;</code></td>
<td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >The list of accepted HTTP methods</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code>&nbsp;&nbsp;</code></td>
<td align="left" valign="top" >
<code>permitted_input_content_types&nbsp;: <code class="type">string list</code>;</code></td>
<td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >The list of accepted content types in requests.
      Content type parameters (like "charset") are ignored.
      If the list is empty, all content types are allowed.</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code>&nbsp;&nbsp;</code></td>
<td align="left" valign="top" >
<code>input_content_length_limit&nbsp;: <code class="type">int</code>;</code></td>
<td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >The maximum size of the request, in bytes.</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code>&nbsp;&nbsp;</code></td>
<td align="left" valign="top" >
<code>workarounds&nbsp;: <code class="type">[ `Backslash_bug<br>       | `MSIE_Content_type_bug<br>       | `Work_around_MSIE_Content_type_bug<br>       | `Work_around_backslash_bug ] list</code>;</code></td>
<td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >The list of enabled workarounds.
<p>
<ul>
<li><code class="code">`MSIE_Content_type_bug</code></li>
</ul>
<ul>
<li><code class="code">`Backslash_bug</code> A common error in MIME implementations is not
      to escape backslashes in quoted string and comments.  This
      workaround mandates that backslashes are handled as normal
      characters.  This is important for e.g. DOS filenames because,
      in the absence of this, the wrongly encoded "C:\dir\file" will
      be decoded as "C:dirfile".</li>
</ul>

      Remark: <code class="code">`Work_around_MSIE_Content_type_bug</code> and
      <code class="code">`Work_around_backslash_bug</code> are deprecated versions of,
      respectively, <code class="code">`MSIE_Content_type_bug</code> and <code class="code">`Backslash_bug</code>.</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td>
</tr>
<tr>
<td align="left" valign="top" >
<code>&nbsp;&nbsp;</code></td>
<td align="left" valign="top" >
<code>default_exn_handler&nbsp;: <code class="type">bool</code>;</code></td>
<td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" >Whether to catch exceptions raised by the script and display an
      error page.  This will keep the connector running even if your
      program has bugs in some of its components.  This will however
      also prevent a stack trace to be printed; if you want this turn
      this option off.</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td>
</tr></table>
}


<pre><span class="keyword">val</span> <a name="VALdefault_config"></a>default_config : <code class="type"><a href="Netcgi.html#TYPEconfig">config</a></code></pre><div class="info">
The default configuration is:<ul>
<li><code class="code">tmp_directory</code>: one of /var/tmp, /tmp, C:\temp, current directory.</li>
<li><code class="code">tmp_prefix</code>: "netcgi"</li>
<li><code class="code">permitted_http_methods</code>: <code class="code">`GET</code>, <code class="code">`HEAD</code>, <code class="code">`POST</code>.</li>
<li><code class="code">permitted_input_content_types</code>: <code class="code">"multipart/form-data"</code>,
      <code class="code">"application/x-www-form-urlencoded"</code>.</li>
<li><code class="code">input_content_length_limit</code>: <code class="code">maxint</code> (i.e., no limit).</li>
<li><code class="code">workarounds</code>: all of them.</li>
<li><code class="code">default_exn_handler</code>: set to <code class="code">true</code>.</li>
</ul>

      To create a custom configuration, it is recommended to use this syntax:
      <pre><code class="code">      let custom_config = { default_config with tmp_prefix = "my_prefix" }
      </code></pre>
      (This syntax is also robust w.r.t. the possible addition of new
      config flields.)<br>
</div>
<pre><span class="keyword">class type</span> <a name="TYPEcgi_environment"></a><a href="Netcgi.cgi_environment.html">cgi_environment</a> = <code class="code">object</code> <a href="Netcgi.cgi_environment.html">..</a> <code class="code">end</code></pre><div class="info">
The environment of a request consists of the information available
    besides the data sent by the user (as key-value pairs).
</div>
<br>
<a name="2_CGIobject"></a>
<h2>CGI object</h2><br>
<pre><span class="keyword">type</span> <a name="TYPEother_url_spec"></a><code class="type"></code>other_url_spec = <code class="type">[ `Env | `None | `This of string ]</code> </pre>
<div class="info">
Determines how an URL part is generated:<ul>
<li><code class="code">`Env</code>: Take the value from the environment.</li>
<li><code class="code">`This v</code>: Use this value <code class="code">v</code>. It must already be URL-encoded.</li>
<li><code class="code">`None</code>: Do not include this part into the URL.</li>
</ul>
<br>
</div>

<pre><span class="keyword">type</span> <a name="TYPEquery_string_spec"></a><code class="type"></code>query_string_spec = <code class="type">[ `Args of <a href="Netcgi.rw_cgi_argument.html">rw_cgi_argument</a> list<br>       | `Env<br>       | `None<br>       | `This of <a href="Netcgi.cgi_argument.html">cgi_argument</a> list ]</code> </pre>
<div class="info">
Determines how the query part of URLs is generated:<ul>
<li><code class="code">`Env</code>: The query string of the current request.</li>
<li><code class="code">`This l</code>: The query string is created from the specified
                     argument list <code class="code">l</code>.</li>
<li><code class="code">`None</code>: The query string is omitted.</li>
<li><code class="code">`Args</code>: <i>deprecated</i>, use <code class="code">`This</code>
                   (left for backward compatibility).</li>
</ul>
<br>
</div>

<pre><span class="keyword">type</span> <a name="TYPEcache_control"></a><code class="type"></code>cache_control = <code class="type">[ `Max_age of int | `No_cache | `Unspecified ]</code> </pre>
<div class="info">
This is only a small subset of the HTTP 1.1 cache control
      features, but they are usually sufficient, and they work for
      HTTP/1.0 as well.  The directives mean:
<p>
<ul>
<li><code class="code">`No_cache</code>: Caches are disabled.  The following headers are
      sent: <code class="code">Cache-control: no-cache</code>, <code class="code">Pragma: no-cache</code>, <code class="code">Expires:</code>
      (now - 1 second)</li>
</ul>
<ul>
<li><code class="code">`Max_age n</code>: Caches are allowed to store a copy of the
      response for <code class="code">n</code> seconds.  After that, the response must be
      revalidated.  The following headers are sent: <code class="code">Cache-control:
      max-age n</code>, <code class="code">Cache-control: must-revalidate</code>, <code class="code">Expires:</code> (now +
      <code class="code">n</code> seconds)</li>
</ul>
<ul>
<li><code class="code">`Unspecified</code>: No cache control header is added to the
      response.</li>
</ul>

      Notes:<ul>
<li>Cache control directives only apply to GET requests; POST
      requests are never cached.</li>
<li>Not only proxies are considered as cache, but also the local
      disk cache of the browser.</li>
<li>HTTP/1.0 did not specify cache behaviour as strictly as
      HTTP/1.1 does.  Because of this the <code class="code">Pragma</code> and <code class="code">Expires</code>
      headers are sent, too.  These fields are not interpreted by
      HTTP/1.1 clients because <code class="code">Cache-control</code> has higher precedence.</li>
</ul>
<br>
</div>

<pre><span class="keyword">class type</span> <a name="TYPEcgi"></a><a href="Netcgi.cgi.html">cgi</a> = <code class="code">object</code> <a href="Netcgi.cgi.html">..</a> <code class="code">end</code></pre><div class="info">
Object symbolizing a CGI-like request/response cycle.
</div>
<pre><span class="keyword">class type</span> <a name="TYPEcgi_activation"></a><a href="Netcgi.cgi_activation.html">cgi_activation</a> = <code class="type"><a href="Netcgi.cgi.html">cgi</a></code></pre><div class="info">
Alternate, more descriptive name for <code class="code">cgi</code>
</div>
<br>
<a name="2_Connectors"></a>
<h2>Connectors</h2><br>
<pre><span class="keyword">type</span> <a name="TYPEoutput_type"></a><code class="type"></code>output_type = <code class="type">[ `Direct of string<br>       | `Transactional of<br>           <a href="Netcgi.html#TYPEconfig">config</a> -><br>           <a href="Netchannels.out_obj_channel.html">Netchannels.out_obj_channel</a> -> <a href="Netchannels.trans_out_obj_channel.html">Netchannels.trans_out_obj_channel</a> ]</code> </pre>
<div class="info">
The ouput type determines how generated data is buffered.<ul>
<li><code class="code">`Direct sep</code>: Data written to the output channel of the
        activation object is not collected in a transaction buffer, but
        directly sent to the browser (the normal I/O buffering is still
        active, however, so call <code class="code">#flush</code> to ensure that data is really
        sent).  The method <code class="code">#commit_work</code> of the output channel is the
        same as <code class="code">#flush</code>.  The method <code class="code">#rollback_work</code> causes that the
        string <code class="code">sep</code> is sent, meant as a separator between the already
        generated output, and the now following error message.</li>
</ul>
<ul>
<li><code class="code">`Transactional f</code>: A transactional channel <code class="code">tc</code> is created
        from the real output channel <code class="code">ch</code> by calling <code class="code">f cfg ch</code> (here,
        <code class="code">cfg</code> is the CGI configuration).  The channel <code class="code">tc</code> is propagated
        as the output channel of the activation object. This means that
        the methods <code class="code">commit_work</code> and <code class="code">rollback_work</code> are implemented by
        <code class="code">tc</code>, and the intended behaviour is that data is buffered in a
        special transaction buffer until <code class="code">commit_work</code> is called.  This
        invocation forces the buffered data to be sent to the
        browser. If, however, <code class="code">rollback_work</code> is called, the buffer is
        cleared.</li>
</ul>

      Two important examples for <code class="code">`Transactional</code> are:<ul>
<li>The transaction buffer is implemented in memory:
      <pre><code class="code">      let buffered _ ch = new Netchannels.buffered_trans_channel ch in
      `Transactional buffered
      </code></pre></li>
<li>The transaction buffer is implemented as an external file:
      <pre><code class="code">      `Transactional(fun _ ch -&gt; new Netchannels.tempfile_output_channel ch)
      </code></pre></li>
</ul>
<br>
</div>

<pre><span class="keyword">type</span> <a name="TYPEarg_store"></a><code class="type"></code>arg_store = <code class="type"><a href="Netcgi.cgi_environment.html">cgi_environment</a> -><br>       string -><br>       <a href="Netmime.mime_header_ro.html">Netmime.mime_header_ro</a> -><br>       [ `Automatic<br>       | `Automatic_max of float<br>       | `Discard<br>       | `File<br>       | `File_max of float<br>       | `Memory<br>       | `Memory_max of float ]</code> </pre>
<div class="info">
This is the type of functions <code class="code">arg_store</code> so that <code class="code">arg_store env
        name header</code> tells whether to <code class="code">`Discard</code> the argument or to
        store it into a <code class="code">`File</code> or in <code class="code">`Memory</code>.  The parameters passed
        to <code class="code">arg_store</code> are as follows:
<p>
<ul>
<li><code class="code">env</code> is the CGI environment.  Thus, for example, you can have
        different policies for different <code class="code">cgi_path_info</code>.</li>
</ul>
<ul>
<li><code class="code">name</code> is the name of the argument.</li>
</ul>
<ul>
<li><code class="code">header</code> is the MIME header of the argument (if any).</li>
</ul>

        Any exception raised by <code class="code">arg_store</code> will be treated like if it
        returned <code class="code">`Discard</code>.  Note that the <code class="code">`File</code> will be treated
        like <code class="code">`Memory</code> except for <code class="code">`POST</code> "multipart/form-data" and
        <code class="code">`PUT</code> queries.
<p>

        <code class="code">`Automatic</code> means to store it into a file if the header
        contains a file name and otherwise in memory (strictly
        speaking <code class="code">`Automatic</code> is not necessary since <code class="code">arg_store</code> can
        check the header but is provided for your convenience).
<p>

        <code class="code">`Memory_max</code> (resp. <code class="code">`File_max</code>, resp. <code class="code">`Automatic_max</code>) is
        the same as <code class="code">`Memory</code> (resp. <code class="code">`File</code>, resp. <code class="code">`Automatic</code>)
        except that the parameter indicates the maximum size in kB of
        the argument value.  If the size is bigger, the
        <a href="Netcgi.cgi_argument.html"><code class="code">Netcgi.cgi_argument</code></a> methods <code class="code">#value</code> and <code class="code">#open_value_rd</code>
        methods will raise <a href="Netcgi.Argument.html#EXCEPTIONOversized"><code class="code">Netcgi.Argument.Oversized</code></a>.
<p>

        Remark: this allows for fine grained size constraints while
        <a href="Netcgi.html#TYPEconfig"><code class="code">Netcgi.config</code></a><code class="code">.input_content_length_limit</code> option is a
        limit on the size of the entire request.<br>
</div>

<pre><span class="keyword">type</span> <a name="TYPEexn_handler"></a><code class="type"></code>exn_handler = <code class="type"><a href="Netcgi.cgi_environment.html">cgi_environment</a> -> (unit -> unit) -> unit</code> </pre>
<div class="info">
A function of type <code class="code">exn_handler</code> allows to define a custom
      handler of uncaught exceptions raised by the <code class="code">unit -&gt; unit</code>
      parameter.  A typical example of <code class="code">exn_handler</code> is as follows:
      <pre><code class="code">      let exn_handler env f =
        try f()
        with
        | Exn1 -&gt; (* generate error page *)
            env#set_output_header_fields [...];
            env#send_output_header();
            env#out_channel#output_string "...";
            env#out_channel#close_out()
        | ...
      </code></pre><br>
</div>

<pre><span class="keyword">type</span> <a name="TYPEconnection_directive"></a><code class="type"></code>connection_directive = <code class="type">[ `Conn_close | `Conn_close_linger | `Conn_error of exn | `Conn_keep_alive ]</code> </pre>
<div class="info">
Directive how to go on with the current connection:<ul>
<li><code class="code">`Conn_close</code>: Just shut down and close descriptor</li>
<li><code class="code">`Conn_close_linger</code>: Linger, shut down, and close descriptor</li>
<li><code class="code">`Conn_keep_alive</code>: Check for another request on the same connection</li>
<li><code class="code">`Conn_error e</code>: Shut down and close descriptor, and handle the
   exception <code class="code">e</code></li>
</ul>
<br>
</div>

<br>
Specific connectors can be found in separate modules.  For example:
<p>
<ul>
<li><a href="Netcgi_cgi.html"><code class="code">Netcgi_cgi</code></a>:  classical CGI.</li>
<li><a href="Netcgi_fcgi.html"><code class="code">Netcgi_fcgi</code></a>: FastCGI protocol.</li>
<li><a href="Netcgi_ajp.html"><code class="code">Netcgi_ajp</code></a>:  AJP 1.3 connector (JSERV protocol).</li>
<li><code class="code">Netcgi_mod</code>:  connector binding to Apache API.</li>
<li><a href="Netcgi_scgi.html"><code class="code">Netcgi_scgi</code></a>: SCGI connector.</li>
<li><a href="Netcgi_test.html"><code class="code">Netcgi_test</code></a>: special "connector" to test your code.</li>
</ul>

    A typical use is as follows:
    <pre><code class="code">    open Netcgi

    let main (cgi:cgi) =
       let arg = cgi#argument_value "name" in
       ...
       cgi#out_channel#commit_work()

    let () =
      let buffered _ ch = new Netchannels.buffered_trans_channel ch in
      Netcgi_cgi.run ~output_type:(`Transactional buffered) main
    </code></pre><br>
</body></html>