|  | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" | 
|  | "http://www.w3.org/TR/REC-html40/loose.dtd"> | 
|  | <HTML> | 
|  | <HEAD> | 
|  | <TITLE>Common Gateway Interface - 1.1 *Draft 03* [http://cgi-spec.golux.com/draft-coar-cgi-v11-03-clean.html] | 
|  | </TITLE> | 
|  | <!--#if expr="$HTTP_USER_AGENT != /Lynx/" --> | 
|  | <!--#set var="GUI" value="1" --> | 
|  | <!--#endif --> | 
|  | <LINK HREF="mailto:Ken.Coar@Golux.Com" rev="revised"> | 
|  | <LINK REL="STYLESHEET" HREF="cgip-style-rfc.css" TYPE="text/css"> | 
|  | <META name="latexstyle" content="rfc"> | 
|  | <META name="author" content="Ken A L Coar"> | 
|  | <META name="institute" content="IBM Corporation"> | 
|  | <META name="date" content="25 June 1999"> | 
|  | <META name="expires" content="Expires 31 December 1999"> | 
|  | <META name="document" content="INTERNET-DRAFT"> | 
|  | <META name="file" content="<draft-coar-cgi-v11-03.txt>"> | 
|  | <META name="group" content="INTERNET-DRAFT"> | 
|  | <!-- | 
|  | There are a lot of BNF fragments in this document.  To make it work | 
|  | in all possible browsers (including Lynx, which is used to turn it | 
|  | into text/plain), we handle these by using PREformatted blocks with | 
|  | a universal internal margin of 2, inside one-level DL blocks. | 
|  | --> | 
|  | </HEAD> | 
|  | <BODY> | 
|  | <!-- | 
|  | HTML doesn't do paper pagination, so we need to fake it out.  Basing | 
|  | our formatting upon RFC2068, there are four (4) lines of header and | 
|  | four (4) lines of footer for each page. | 
|  |  | 
|  | <DIV ALIGN="CENTER"> | 
|  | <PRE> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | Coar, et al.               CGI/1.1 Specification                     May, 1998 | 
|  | INTERNET-DRAFT             Expires 1 December 1998                    [Page 2] | 
|  |  | 
|  |  | 
|  | </PRE> | 
|  | </DIV> | 
|  | --> | 
|  | <!-- | 
|  | The following weirdness wrt non-breaking spaces is to get Lynx | 
|  | (which is barely TABLE-aware) to line the left/right justified | 
|  | text up properly. | 
|  | --> | 
|  | <DIV ALIGN="CENTER"> | 
|  | <TABLE WIDTH="100%" CELLPADDING=0 CELLSPACING=0> | 
|  | <TR VALIGN="TOP"> | 
|  | <TD ALIGN="LEFT"> | 
|  | INTERNET-DRAFT                                 | 
|  | </TD> | 
|  | <TD ALIGN="RIGHT"> | 
|  |           Ken A L Coar | 
|  | </TD> | 
|  | </TR> | 
|  | <TR VALIGN="TOP"> | 
|  | <TD ALIGN="LEFT"> | 
|  | draft-coar-cgi-v11-03.{html,txt}              | 
|  | </TD> | 
|  | <TD ALIGN="RIGHT"> | 
|  |         IBM Corporation | 
|  | </TD> | 
|  | </TR> | 
|  | <TR VALIGN="TOP"> | 
|  | <TD ALIGN="LEFT"> | 
|  |                                                 | 
|  | </TD> | 
|  | <TD ALIGN="RIGHT"> | 
|  |       D.R.T. Robinson | 
|  | </TD> | 
|  | </TR> | 
|  | <TR VALIGN="TOP"> | 
|  | <TD ALIGN="LEFT"> | 
|  |                                                 | 
|  | </TD> | 
|  | <TD ALIGN="RIGHT"> | 
|  |       E*TRADE UK Ltd. | 
|  | </TD> | 
|  | </TR> | 
|  | <TR VALIGN="TOP"> | 
|  | <TD ALIGN="LEFT"> | 
|  |                                                 | 
|  | </TD> | 
|  | <TD ALIGN="RIGHT"> | 
|  |         25 June 1999 | 
|  | </TD> | 
|  | </TR> | 
|  | </TABLE> | 
|  | </DIV> | 
|  |  | 
|  | <H1 ALIGN="CENTER"> | 
|  | The WWW Common Gateway Interface | 
|  | <BR> | 
|  | Version 1.1 | 
|  | </H1> | 
|  |  | 
|  | <!--#include virtual="I-D-statement" --> | 
|  |  | 
|  | <H2> | 
|  | <A NAME="Abstract"> | 
|  | Abstract | 
|  | </A> | 
|  | </H2> | 
|  | <P> | 
|  | The Common Gateway Interface (CGI) is a simple interface for running | 
|  | external programs, software or gateways under an information server | 
|  | in a platform-independent manner. Currently, the supported information | 
|  | servers are HTTP servers. | 
|  | </P> | 
|  | <P> | 
|  | The interface has been in use by the World-Wide Web since 1993. This | 
|  | specification defines the | 
|  | "current practice" parameters of the | 
|  | 'CGI/1.1' interface developed and documented at the U.S. National | 
|  | Centre for Supercomputing Applications [NCSA-CGI]. | 
|  | This document also defines the use of the CGI/1.1 interface | 
|  | on the Unix and AmigaDOS(tm) systems. | 
|  | </P> | 
|  | <P> | 
|  | Discussion of this draft occurs on the CGI-WG mailing list; see the | 
|  | project Web page at | 
|  | <SAMP><URL:<A HREF="http://CGI-Spec.Golux.Com/" | 
|  | >http://CGI-Spec.Golux.Com/</A>></SAMP> | 
|  | for details on the mailing list and the status of the project. | 
|  | </P> | 
|  |  | 
|  | <!--#if expr="$GUI" --> | 
|  | <H2> | 
|  | Revision History | 
|  | </H2> | 
|  | <P> | 
|  | The revision history of this draft is being maintained using Web-based | 
|  | GUI notation, such as struck-through characters and colour-coded | 
|  | sections.  The following legend describes how to determine the origin | 
|  | of a particular revision according to the colour of the text: | 
|  | </P> | 
|  | <DL COMPACT> | 
|  | <DT>Black | 
|  | </DT> | 
|  | <DD>Revision 00, released 28 May 1998 | 
|  | </DD> | 
|  | <DT>Green | 
|  | </DT> | 
|  | <DD>Revision 01, released 28 December 1998 | 
|  | <BR> | 
|  | Major structure change: Section 4, "Request Metadata (Meta-Variables)" | 
|  | was moved entirely under <A HREF="#7.0">Section 7</A>, "Data Input to the | 
|  | CGI Script." | 
|  | Due to the size of this change, it is noted here and the text in its | 
|  | former location does <EM>not</EM> appear as struckthrough.  This has | 
|  | caused major <A HREF="#6.0">sections 5</A> and following to decrement | 
|  | by one.  Other | 
|  | large text movements are likewise not marked up.  References to RFC | 
|  | 1738 were changed to 2396 (1738's replacement). | 
|  | </DD> | 
|  | <DT>Red | 
|  | </DT> | 
|  | <DD>Revision 02, released 2 April, 1999 | 
|  | <BR> | 
|  | Added text to <A HREF="#8.3">section 8.3</A> defining correct handling | 
|  | of HTTP/1.1 | 
|  | requests using "chunked" Transfer-Encoding.  Labelled metavariable | 
|  | names in <A HREF="#8.0">section 8</A> with the appropriate detail section | 
|  | numbers. | 
|  | Clarified allowed usage of <SAMP>Status</SAMP> and | 
|  | <SAMP>Location</SAMP> response header fields.  Included new | 
|  | Internet-Draft language. | 
|  | </DD> | 
|  | <DT>Fuchsia | 
|  | </DT> | 
|  | <DD>Revision 03, released 25 June 1999 | 
|  | <BR> | 
|  | Changed references from "HTTP" to "Protocol-Specific" for the listing of | 
|  | things like HTTP_ACCEPT.  Changed 'entity-body' and 'content-body' to | 
|  | 'message-body.'  Added a note that response headers must comply with | 
|  | requirements of the protocol level in use.  Added a lot of stuff about | 
|  | security (section 11).  Clarified a bunch of productions.  Pointed out | 
|  | that zero-length and omitted values are indistinguishable in this | 
|  | specification.  Clarified production describing order of fields in | 
|  | script response header.  Clarified issues surrounding encoding of | 
|  | data.  Acknowledged additional contributors, and changed one of | 
|  | the authors' addresses. | 
|  | </DD> | 
|  | </DL> | 
|  | <!--#endif --> | 
|  |  | 
|  | <H2> | 
|  | <A NAME="Contents"> | 
|  | Table of Contents | 
|  | </A> | 
|  | </H2> | 
|  | <DIV ALIGN="CENTER"> | 
|  | <PRE> | 
|  | 1 Introduction..............................................<A | 
|  | HREF="#1.0" | 
|  | >TBD</A> | 
|  | 1.1 Purpose................................................<A | 
|  | HREF="#1.1" | 
|  | >TBD</A> | 
|  | 1.2 Requirements...........................................<A | 
|  | HREF="#1.2" | 
|  | >TBD</A> | 
|  | 1.3 Specifications.........................................<A | 
|  | HREF="#1.3" | 
|  | >TBD</A> | 
|  | 1.4 Terminology............................................<A | 
|  | HREF="#1.4" | 
|  | >TBD</A> | 
|  | 2 Notational Conventions and Generic Grammar................<A | 
|  | HREF="#2.0" | 
|  | >TBD</A> | 
|  | 2.1 Augmented BNF..........................................<A | 
|  | HREF="#2.1" | 
|  | >TBD</A> | 
|  | 2.2 Basic Rules............................................<A | 
|  | HREF="#2.2" | 
|  | >TBD</A> | 
|  | 3 Protocol Parameters.......................................<A | 
|  | HREF="#3.0" | 
|  | >TBD</A> | 
|  | 3.1 URL Encoding...........................................<A | 
|  | HREF="#3.1" | 
|  | >TBD</A> | 
|  | 3.2 The Script-URI.........................................<A | 
|  | HREF="#3.2" | 
|  | >TBD</A> | 
|  | 4 Invoking the Script.......................................<A | 
|  | HREF="#4.0" | 
|  | >TBD</A> | 
|  | 5 The CGI Script Command Line...............................<A | 
|  | HREF="#5.0" | 
|  | >TBD</A> | 
|  | 6 Data Input to the CGI Script..............................<A | 
|  | HREF="#6.0" | 
|  | >TBD</A> | 
|  | 6.1 Request Metadata (Metavariables).......................<A | 
|  | HREF="#6.1" | 
|  | >TBD</A> | 
|  | 6.1.1 AUTH_TYPE...........................................<A | 
|  | HREF="#6.1.1" | 
|  | >TBD</A> | 
|  | 6.1.2 CONTENT_LENGTH......................................<A | 
|  | HREF="#6.1.2" | 
|  | >TBD</A> | 
|  | 6.1.3 CONTENT_TYPE........................................<A | 
|  | HREF="#6.1.3" | 
|  | >TBD</A> | 
|  | 6.1.4 GATEWAY_INTERFACE...................................<A | 
|  | HREF="#6.1.4" | 
|  | >TBD</A> | 
|  | 6.1.5 Protocol-Specific Metavariables.....................<A | 
|  | HREF="#6.1.5" | 
|  | >TBD</A> | 
|  | 6.1.6 PATH_INFO...........................................<A | 
|  | HREF="#6.1.6" | 
|  | >TBD</A> | 
|  | 6.1.7 PATH_TRANSLATED.....................................<A | 
|  | HREF="#6.1.7" | 
|  | >TBD</A> | 
|  | 6.1.8 QUERY_STRING........................................<A | 
|  | HREF="#6.1.8" | 
|  | >TBD</A> | 
|  | 6.1.9 REMOTE_ADDR.........................................<A | 
|  | HREF="#6.1.9" | 
|  | >TBD</A> | 
|  | 6.1.10 REMOTE_HOST........................................<A | 
|  | HREF="#6.1.10" | 
|  | >TBD</A> | 
|  | 6.1.11 REMOTE_IDENT.......................................<A | 
|  | HREF="#6.1.11" | 
|  | >TBD</A> | 
|  | 6.1.12 REMOTE_USER........................................<A | 
|  | HREF="#6.1.12" | 
|  | >TBD</A> | 
|  | 6.1.13 REQUEST_METHOD.....................................<A | 
|  | HREF="#6.1.13" | 
|  | >TBD</A> | 
|  | 6.1.14 SCRIPT_NAME........................................<A | 
|  | HREF="#6.1.14" | 
|  | >TBD</A> | 
|  | 6.1.15 SERVER_NAME........................................<A | 
|  | HREF="#6.1.15" | 
|  | >TBD</A> | 
|  | 6.1.16 SERVER_PORT........................................<A | 
|  | HREF="#6.1.16" | 
|  | >TBD</A> | 
|  | 6.1.17 SERVER_PROTOCOL....................................<A | 
|  | HREF="#6.1.17" | 
|  | >TBD</A> | 
|  | 6.1.18 SERVER_SOFTWARE....................................<A | 
|  | HREF="#6.1.18" | 
|  | >TBD</A> | 
|  | 6.2 Request Message-Bodies................................<A | 
|  | HREF="#6.2" | 
|  | >TBD</A> | 
|  | 7 Data Output from the CGI Script...........................<A | 
|  | HREF="#7.0" | 
|  | >TBD</A> | 
|  | 7.1 Non-Parsed Header Output...............................<A | 
|  | HREF="#7.1" | 
|  | >TBD</A> | 
|  | 7.2 Parsed Header Output...................................<A | 
|  | HREF="#7.2" | 
|  | >TBD</A> | 
|  | 7.2.1 CGI header fields...................................<A | 
|  | HREF="#7.2.1" | 
|  | >TBD</A> | 
|  | 7.2.1.1 Content-Type.....................................<A | 
|  | HREF="#7.2.1.1" | 
|  | >TBD</A> | 
|  | 7.2.1.2 Location.........................................<A | 
|  | HREF="#7.2.1.2" | 
|  | >TBD</A> | 
|  | 7.2.1.3 Status...........................................<A | 
|  | HREF="#7.2.1.3" | 
|  | >TBD</A> | 
|  | 7.2.1.4 Extension header fields..........................<A | 
|  | HREF="#7.2.1.3" | 
|  | >TBD</A> | 
|  | 7.2.2 HTTP header fields..................................<A | 
|  | HREF="#7.2.2" | 
|  | >TBD</A> | 
|  | 8 Server Implementation.....................................<A | 
|  | HREF="#8.0" | 
|  | >TBD</A> | 
|  | 8.1 Requirements for Servers...............................<A | 
|  | HREF="#8.1" | 
|  | >TBD</A> | 
|  | 8.1.1 Script-URI..........................................<A | 
|  | HREF="#8.1" | 
|  | >TBD</A> | 
|  | 8.1.2 Request Message-body Handling.......................<A | 
|  | HREF="#8.1.2" | 
|  | >TBD</A> | 
|  | 8.1.3 Required Metavariables..............................<A | 
|  | HREF="#8.1.3" | 
|  | >TBD</A> | 
|  | 8.1.4 Response Compliance.................................<A | 
|  | HREF="#8.1.4" | 
|  | >TBD</A> | 
|  | 8.2 Recommendations for Servers............................<A | 
|  | HREF="#8.2" | 
|  | >TBD</A> | 
|  | 8.3 Summary of Metavariables...............................<A | 
|  | HREF="#8.3" | 
|  | >TBD</A> | 
|  | 9 Script Implementation.....................................<A | 
|  | HREF="#9.0" | 
|  | >TBD</A> | 
|  | 9.1 Requirements for Scripts...............................<A | 
|  | HREF="#9.1" | 
|  | >TBD</A> | 
|  | 9.2 Recommendations for Scripts............................<A | 
|  | HREF="#9.2" | 
|  | >TBD</A> | 
|  | 10 System Specifications....................................<A | 
|  | HREF="#10.0" | 
|  | >TBD</A> | 
|  | 10.1 AmigaDOS..............................................<A | 
|  | HREF="#10.1" | 
|  | >TBD</A> | 
|  | 10.2 Unix..................................................<A | 
|  | HREF="#10.2" | 
|  | >TBD</A> | 
|  | 11 Security Considerations..................................<A | 
|  | HREF="#11.0" | 
|  | >TBD</A> | 
|  | 11.1 Safe Methods..........................................<A | 
|  | HREF="#11.1" | 
|  | >TBD</A> | 
|  | 11.2 HTTP Header Fields Containing Sensitive Information...<A | 
|  | HREF="#11.2" | 
|  | >TBD</A> | 
|  | 11.3 Script Interference with the Server...................<A | 
|  | HREF="#11.3" | 
|  | >TBD</A> | 
|  | 11.4 Data Length and Buffering Considerations..............<A | 
|  | HREF="#11.4" | 
|  | >TBD</A> | 
|  | 11.5 Stateless Processing..................................<A | 
|  | HREF="#11.5" | 
|  | >TBD</A> | 
|  | 12 Acknowledgments..........................................<A | 
|  | HREF="#12.0" | 
|  | >TBD</A> | 
|  | 13 References...............................................<A | 
|  | HREF="#13.0" | 
|  | >TBD</A> | 
|  | 14 Authors' Addresses.......................................<A | 
|  | HREF="#14.0" | 
|  | >TBD</A> | 
|  | </PRE> | 
|  | </DIV> | 
|  |  | 
|  | <H2> | 
|  | <A NAME="1.0"> | 
|  | 1. Introduction | 
|  | </A> | 
|  | </H2> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="1.1"> | 
|  | 1.1. Purpose | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | Together the HTTP [<A HREF="#[3]">3</A>,<A HREF="#[8]">8</A>] server | 
|  | and the CGI script are responsible | 
|  | for servicing a client | 
|  | request by sending back responses. The client | 
|  | request comprises a Universal Resource Identifier (URI) | 
|  | [<A HREF="#[1]">1</A>], a | 
|  | request method, and various ancillary | 
|  | information about the request | 
|  | provided by the transport mechanism. | 
|  | </P> | 
|  | <P> | 
|  | The CGI defines the abstract parameters, known as | 
|  | metavariables, | 
|  | which describe the client's | 
|  | request. Together with a | 
|  | concrete programmer interface this specifies a platform-independent | 
|  | interface between the script and the HTTP server. | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="1.2"> | 
|  | 1.2. Requirements | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | This specification uses the same words as RFC 1123 | 
|  | [<A HREF="#[5]">5</A>] to define the | 
|  | significance of each particular requirement. These are: | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <DL> | 
|  | <DT><EM>MUST</EM> | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | This word or the adjective 'required' means that the item is an | 
|  | absolute requirement of the specification. | 
|  | </P> | 
|  | </DD> | 
|  | <DT><EM>SHOULD</EM> | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | This word or the adjective 'recommended' means that there may | 
|  | exist valid reasons in particular circumstances to ignore this | 
|  | item, but the full implications should be understood and the case | 
|  | carefully weighed before choosing a different course. | 
|  | </P> | 
|  | </DD> | 
|  | <DT><EM>MAY</EM> | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | This word or the adjective 'optional' means that this item is | 
|  | truly optional. One vendor may choose to include the item because | 
|  | a particular marketplace requires it or because it enhances the | 
|  | product, for example; another vendor may omit the same item. | 
|  | </P> | 
|  | </DD> | 
|  | </DL> | 
|  | <P> | 
|  | An implementation is not compliant if it fails to satisfy one or more | 
|  | of the 'must' requirements for the protocols it implements. An | 
|  | implementation that satisfies all of the 'must' and all of the | 
|  | 'should' requirements for its features is said to be 'unconditionally | 
|  | compliant'; one that satisfies all of the 'must' requirements but not | 
|  | all of the 'should' requirements for its features is said to be | 
|  | 'conditionally compliant.' | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="1.3"> | 
|  | 1.3. Specifications | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | Not all of the functions and features of the CGI are defined in the | 
|  | main part of this specification. The following phrases are used to | 
|  | describe the features which are not specified: | 
|  | </P> | 
|  | <DL> | 
|  | <DT><EM>system defined</EM> | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | The feature may differ between systems, but must be the same for | 
|  | different implementations using the same system. A system will | 
|  | usually identify a class of operating-systems. Some systems are | 
|  | defined in | 
|  | <A HREF="#10.0" | 
|  | >section 10</A> of this document. | 
|  | New systems may be defined | 
|  | by new specifications without revision of this document. | 
|  | </P> | 
|  | </DD> | 
|  | <DT><EM>implementation defined</EM> | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | The behaviour of the feature may vary from implementation to | 
|  | implementation, but a particular implementation must document its | 
|  | behaviour. | 
|  | </P> | 
|  | </DD> | 
|  | </DL> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="1.4"> | 
|  | 1.4. Terminology | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | This specification uses many terms defined in the HTTP/1.1 | 
|  | specification [<A HREF="#[8]">8</A>]; however, the following terms are | 
|  | used here in a | 
|  | sense which may not accord with their definitions in that document, | 
|  | or with their common meaning. | 
|  | </P> | 
|  |  | 
|  | <DL> | 
|  | <DT><EM>metavariable</EM> | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | A named parameter that carries information from the server to the | 
|  | script. It is not necessarily a variable in the operating-system's | 
|  | environment, although that is the most common implementation. | 
|  | </P> | 
|  | </DD> | 
|  |  | 
|  | <DT><EM>script</EM> | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | The software which is invoked by the server <EM>via</EM> this | 
|  | interface. It | 
|  | need not be a standalone program, but could be a | 
|  | dynamically-loaded or shared library, or even a subroutine in the | 
|  | server.  It <EM>may</EM> be a set of statements | 
|  | interpreted at run-time, as the term 'script' is frequently | 
|  | understood, but that is not a requirement and within the context | 
|  | of this specification the term has the broader definition stated. | 
|  | </P> | 
|  | </DD> | 
|  | <DT><EM>server</EM> | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | The application program which invokes the script in order to service | 
|  | requests. | 
|  | </P> | 
|  | </DD> | 
|  | </DL> | 
|  |  | 
|  | <H2> | 
|  | <A NAME="2.0"> | 
|  | 2. Notational Conventions and Generic Grammar | 
|  | </A> | 
|  | </H2> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="2.1"> | 
|  | 2.1. Augmented BNF | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | All of the mechanisms specified in this document are described in | 
|  | both prose and an augmented Backus-Naur Form (BNF) similar to that | 
|  | used by RFC 822 [<A HREF="#[6]">6</A>]. This augmented BNF contains | 
|  | the following constructs: | 
|  | </P> | 
|  | <DL> | 
|  | <DT>name = definition | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | The | 
|  | definition by the equal character ("="). Whitespace is only | 
|  | significant in that continuation lines of a definition are | 
|  | indented. | 
|  | </P> | 
|  | </DD> | 
|  | <DT>"literal" | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | Quotation marks (") surround literal text, except for a literal | 
|  | quotation mark, which is surrounded by angle-brackets ("<" and ">"). | 
|  | Unless stated otherwise, the text is case-sensitive. | 
|  | </P> | 
|  | </DD> | 
|  | <DT>rule1 | rule2 | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | Alternative rules are separated by a vertical bar ("|"). | 
|  | </P> | 
|  | </DD> | 
|  | <DT>(rule1 rule2 rule3) | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | Elements enclosed in parentheses are treated as a single element. | 
|  | </P> | 
|  | </DD> | 
|  | <DT>*rule | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | A rule preceded by an asterisk ("*") may have zero or more | 
|  | occurrences. A rule preceded by an integer followed by an asterisk | 
|  | must occur at least the specified number of times. | 
|  | </P> | 
|  | </DD> | 
|  | <DT>[rule] | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | An element enclosed in square | 
|  | brackets ("[" and "]") is optional. | 
|  | </P> | 
|  | </DD> | 
|  | </DL> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="2.2"> | 
|  | 2.2. Basic Rules | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | The following rules are used throughout this specification to | 
|  | describe basic parsing constructs. | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | alpha         = lowalpha | hialpha | 
|  | alphanum      = alpha | digit | 
|  | lowalpha      = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | 
|  | | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | 
|  | | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | 
|  | | "y" | "z" | 
|  | hialpha       = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | 
|  | | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | 
|  | | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | 
|  | | "Y" | "Z" | 
|  | digit         = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | 
|  | | "8" | "9" | 
|  | hex           = digit | "A" | "B" | "C" | "D" | "E" | "F" | "a" | 
|  | | "b" | "c" | "d" | "e" | "f" | 
|  | escaped       = "%" hex hex | 
|  | OCTET         = <any 8-bit sequence of data> | 
|  | CHAR          = <any US-ASCII character (octets 0 - 127)> | 
|  | CTL           = <any US-ASCII control character | 
|  | (octets 0 - 31) and DEL (127)> | 
|  | CR            = <US-ASCII CR, carriage return (13)> | 
|  | LF            = <US-ASCII LF, linefeed (10)> | 
|  | SP            = <US-ASCII SP, space (32)> | 
|  | HT            = <US-ASCII HT, horizontal tab (9)> | 
|  | NL            = CR | LF | 
|  | LWSP          = SP | HT | NL | 
|  | tspecial      = "(" | ")" | "@" | "," | ";" | ":" | "\" | <"> | 
|  | | "/" | "[" | "]" | "?" | "<" | ">" | "{" | "}" | 
|  | | SP | HT | NL | 
|  | token         = 1*<any CHAR except CTLs or tspecials> | 
|  | quoted-string = ( <"> *qdtext <"> ) | ( "<" *qatext ">") | 
|  | qdtext        = <any CHAR except <"> and CTLs but including LWSP> | 
|  | qatext        = <any CHAR except "<", ">" and CTLs but | 
|  | including LWSP> | 
|  | mark          = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")" | 
|  | unreserved    = alphanum | mark | 
|  | reserved      = ";" | "/" | "?" | ":" | "@" | "&" | "=" | | 
|  | "$" | "," | 
|  | uric          = reserved | unreserved | escaped | 
|  | </PRE> | 
|  | <P> | 
|  | Note that newline (NL) need not be a single character, but can be a | 
|  | character sequence. | 
|  | </P> | 
|  |  | 
|  | <H2> | 
|  | <A NAME="3.0"> | 
|  | 3. Protocol Parameters | 
|  | </A> | 
|  | </H2> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="3.1"> | 
|  | 3.1. URL Encoding | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | Some variables and constructs used here are described as being | 
|  | 'URL-encoded'. This encoding is described in section | 
|  | 2 of RFC | 
|  | 2396 | 
|  | [<A HREF="#[4]">4</A>]. | 
|  | </P> | 
|  | <P> | 
|  | An alternate "shortcut" encoding for representing the space | 
|  | character exists and is in common use.  Scripts MUST be prepared to | 
|  | recognise both '+' and '%20' as an encoded space in a | 
|  | URL-encoded value. | 
|  | </P> | 
|  | <P> | 
|  | Note that some unsafe characters may have different semantics if | 
|  | they are encoded. The definition of which characters are unsafe | 
|  | depends on the context. | 
|  | For example, the following two URLs do not | 
|  | necessarily refer to the same resource: | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | http://somehost.com/somedir%2Fvalue | 
|  | http://somehost.com/somedir/value | 
|  | </PRE> | 
|  | <P> | 
|  | See section | 
|  | 2 of RFC | 
|  | 2396 [<A HREF="#[4]">4</A>] | 
|  | for authoritative treatment of this issue. | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="3.2"> | 
|  | 3.2. The Script-URI | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | The 'Script-URI' is defined as the URI of the resource identified | 
|  | by the metavariables.   Often, | 
|  | this URI will be the same as | 
|  | the URI requested by the client (the 'Client-URI'); however, it need | 
|  | not be. Instead, it could be a URI invented by the server, and so it | 
|  | can only be used in the context of the server and its CGI interface. | 
|  | </P> | 
|  | <P> | 
|  | The Script-URI has the syntax of generic-RL as defined in section 2.1 | 
|  | of RFC 1808 [<A HREF="#[7]">7</A>], with the exception that object | 
|  | parameters and | 
|  | fragment identifiers are not permitted: | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | <scheme>://<host><port>/<path>?<query> | 
|  | </PRE> | 
|  | <P> | 
|  | The various components of the | 
|  | Script-URI | 
|  | are defined by some of the | 
|  | metavariables (see | 
|  | <A HREF="#4.0">section 4</A> | 
|  | below); | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | script-uri = protocol "://" SERVER_NAME ":" SERVER_PORT enc-script | 
|  | enc-path-info "?" QUERY_STRING | 
|  | </PRE> | 
|  | <P> | 
|  | where 'protocol' is obtained | 
|  | from SERVER_PROTOCOL, 'enc-script' is a | 
|  | URL-encoded version of SCRIPT_NAME and 'enc-path-info' is a | 
|  | URL-encoded version of PATH_INFO.  See | 
|  | <A HREF="#4.6">section 4.6</A> for more information about the PATH_INFO | 
|  | metavariable. | 
|  | </P> | 
|  | <P> | 
|  | Note that the scheme and the protocol are <EM>not</EM> identical; | 
|  | for instance, a resource accessed <EM>via</EM> an SSL mechanism | 
|  | may have a Client-URI with a scheme of "<SAMP>https</SAMP>" | 
|  | rather than "<SAMP>http</SAMP>".   CGI/1.1 provides no means | 
|  | for the script to reconstruct this, and therefore | 
|  | the Script-URI includes the base protocol used. | 
|  | </P> | 
|  |  | 
|  | <H2> | 
|  | <A NAME="4.0"> | 
|  | 4. Invoking the Script | 
|  | </A> | 
|  | </H2> | 
|  | <P> | 
|  | The | 
|  | script is invoked in a system defined manner. Unless specified | 
|  | otherwise, the file containing the script will be invoked as an | 
|  | executable program. | 
|  | </P> | 
|  |  | 
|  | <H2> | 
|  | <A NAME="5.0"> | 
|  | 5. The CGI Script Command Line | 
|  | </A> | 
|  | </H2> | 
|  | <P> | 
|  | Some systems support a method for supplying an array of strings to | 
|  | the CGI script. This is only used in the case of an 'indexed' query. | 
|  | This is identified by a "GET" or "HEAD" HTTP request with a URL | 
|  | query | 
|  | string not containing any unencoded "=" characters. For such a | 
|  | request, | 
|  | servers SHOULD parse the search string | 
|  | into words, using the following rules: | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | search-string = search-word *( "+" search-word ) | 
|  | search-word   = 1*schar | 
|  | schar         = xunreserved | escaped | xreserved | 
|  | xunreserved   = alpha | digit | xsafe | extra | 
|  | xsafe         = "$" | "-" | "_" | "." | 
|  | xreserved     = ";" | "/" | "?" | ":" | "@" | "&" | 
|  | </PRE> | 
|  | <P> | 
|  | After parsing, each word is URL-decoded, optionally encoded in a | 
|  | system defined manner, | 
|  | and then the argument list is set to the list | 
|  | of words. | 
|  | </P> | 
|  | <P> | 
|  | If the server cannot create any part of the argument list, then the | 
|  | server SHOULD NOT generate any command line information. For example, the | 
|  | number of arguments may be greater than operating system or server | 
|  | limitations permit, or one of the words may not be representable as an | 
|  | argument. | 
|  | </P> | 
|  | <P> | 
|  | Scripts SHOULD check to see if the QUERY_STRING value contains an | 
|  | unencoded "=" character, and SHOULD NOT use the command line arguments | 
|  | if it does. | 
|  | </P> | 
|  |  | 
|  | <H2> | 
|  | <A NAME="6.0"> | 
|  | 6. Data Input to the CGI Script | 
|  | </A> | 
|  | </H2> | 
|  | <P> | 
|  | Information about a request comes from two different sources: the | 
|  | request header, and any associated | 
|  | message-body. | 
|  | Servers MUST | 
|  | make portions of this information available to | 
|  | scripts. | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="6.1"> | 
|  | 6.1. Request Metadata | 
|  | (Metavariables) | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | Each CGI server | 
|  | implementation MUST define a mechanism | 
|  | to pass data about the request from | 
|  | the server to the script. | 
|  | The metavariables containing these | 
|  | data | 
|  | are accessed by the script in a system | 
|  | defined manner. | 
|  | The | 
|  | representation of the characters in the | 
|  | metavariables is | 
|  | system defined. | 
|  | </P> | 
|  | <P> | 
|  | This specification does not distinguish between the representation of | 
|  | null values and missing ones.  Whether null or missing values | 
|  | (such as a query component of "?" or "", respectively) are represented | 
|  | by undefined metavariables or by metavariables with values of "" is | 
|  | implementation-defined. | 
|  | </P> | 
|  | <P> | 
|  | Case is not significant in the | 
|  | metavariable | 
|  | names, in that there cannot be two | 
|  | different variables | 
|  | whose names differ in case only. Here they are | 
|  | shown using a canonical representation of capitals plus underscore | 
|  | ("_"). The actual representation of the names is system defined; for | 
|  | a particular system the representation MAY be defined differently | 
|  | than this. | 
|  | </P> | 
|  | <P> | 
|  | Metavariable | 
|  | values MUST be | 
|  | considered case-sensitive except as noted | 
|  | otherwise. | 
|  | </P> | 
|  | <P> | 
|  | The canonical | 
|  | metavariables | 
|  | defined by this specification are: | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | AUTH_TYPE | 
|  | CONTENT_LENGTH | 
|  | CONTENT_TYPE | 
|  | GATEWAY_INTERFACE | 
|  | PATH_INFO | 
|  | PATH_TRANSLATED | 
|  | QUERY_STRING | 
|  | REMOTE_ADDR | 
|  | REMOTE_HOST | 
|  | REMOTE_IDENT | 
|  | REMOTE_USER | 
|  | REQUEST_METHOD | 
|  | SCRIPT_NAME | 
|  | SERVER_NAME | 
|  | SERVER_PORT | 
|  | SERVER_PROTOCOL | 
|  | SERVER_SOFTWARE | 
|  | </PRE> | 
|  | <P> | 
|  | Metavariables with names beginning with the protocol name (<EM>e.g.</EM>, | 
|  | "HTTP_ACCEPT") are also canonical in their description of request header | 
|  | fields.  The number and meaning of these fields may change independently | 
|  | of this specification.  (See also <A HREF="#6.1.5">section 6.1.5</A>.) | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.1"> | 
|  | 6.1.1. AUTH_TYPE | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | This variable is specific to requests made | 
|  | <EM>via</EM> the | 
|  | "<CODE>http</CODE>" | 
|  | scheme. | 
|  | </P> | 
|  | <P> | 
|  | If the Script-URI | 
|  | required access authentication for external | 
|  | access, then the server | 
|  | MUST set | 
|  | the value of | 
|  | this variable | 
|  | from the '<SAMP>auth-scheme</SAMP>' token in | 
|  | the request's "<SAMP>Authorization</SAMP>" header | 
|  | field. | 
|  | Otherwise | 
|  | it is | 
|  | set to NULL. | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | AUTH_TYPE   = "" | auth-scheme | 
|  | auth-scheme = "Basic" | "Digest" | token | 
|  | </PRE> | 
|  | <P> | 
|  | HTTP access authentication schemes are described in section 11 of the | 
|  | HTTP/1.1 specification [<A HREF="#[8]">8</A>]. The auth-scheme is | 
|  | not case-sensitive. | 
|  | </P> | 
|  | <P> | 
|  | Servers | 
|  | MUST | 
|  | provide this metavariable | 
|  | to scripts if the request | 
|  | header included an "<SAMP>Authorization</SAMP>" field | 
|  | that was authenticated. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.2"> | 
|  | 6.1.2. CONTENT_LENGTH | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | This | 
|  | metavariable | 
|  | is set to the | 
|  | size of the message-body | 
|  | entity attached to the request, if any, in decimal | 
|  | number of octets. If no data are attached, then this | 
|  | metavariable | 
|  | is either NULL or not | 
|  | defined. The syntax is | 
|  | the same as for | 
|  | the HTTP "<SAMP>Content-Length</SAMP>" header field (section 14.14, HTTP/1.1 | 
|  | specification [<A HREF="#[8]">8</A>]). | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | CONTENT_LENGTH = "" | 1*digit | 
|  | </PRE> | 
|  | <P> | 
|  | Servers MUST provide this metavariable | 
|  | to scripts if the request | 
|  | was accompanied by a | 
|  | message-body entity. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.3"> | 
|  | 6.1.3. CONTENT_TYPE | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | If the request includes a | 
|  | message-body, | 
|  | CONTENT_TYPE is set | 
|  | to | 
|  | the Internet Media Type | 
|  | [<A HREF="#[9]">9</A>] of the attached | 
|  | entity if the type was provided <EM>via</EM> | 
|  | a "<SAMP>Content-type</SAMP>" field in the | 
|  | request header, or if the server can determine it in the absence | 
|  | of a supplied "<SAMP>Content-type</SAMP>" field. The syntax is the | 
|  | same as for the HTTP | 
|  | "<SAMP>Content-Type</SAMP>" header field. | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | CONTENT_TYPE = "" | media-type | 
|  | media-type   = type "/" subtype *( ";" parameter) | 
|  | type         = token | 
|  | subtype      = token | 
|  | parameter    = attribute "=" value | 
|  | attribute    = token | 
|  | value        = token | quoted-string | 
|  | </PRE> | 
|  | <P> | 
|  | The type, subtype, | 
|  | and parameter attribute names are not | 
|  | case-sensitive. Parameter values MAY be case sensitive. | 
|  | Media types and their use in HTTP are described | 
|  | in section 3.7 of the | 
|  | HTTP/1.1 specification [<A HREF="#[8]">8</A>]. | 
|  | </P> | 
|  | <P> | 
|  | Example: | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | application/x-www-form-urlencoded | 
|  | </PRE> | 
|  | <P> | 
|  | There is no default value for this variable. If and only if it is | 
|  | unset, then the script MAY attempt to determine the media type from | 
|  | the data received. If the type remains unknown, then | 
|  | the script MAY choose to either assume a | 
|  | content-type of | 
|  | <SAMP>application/octet-stream</SAMP> | 
|  | or reject the request with  a 415 ("Unsupported Media Type") | 
|  | error.  See <A HREF="#7.2.1.3">section 7.2.1.3</A> | 
|  | for more information about returning error status values. | 
|  | </P> | 
|  | <P> | 
|  | Servers MUST provide this metavariable | 
|  | to scripts if | 
|  | a "<SAMP>Content-Type</SAMP>" field was present | 
|  | in the original request header.  If the server receives a request | 
|  | with an attached entity but no "<SAMP>Content-Type</SAMP>" | 
|  | header field, it MAY attempt to | 
|  | determine the correct datatype, or it MAY omit this | 
|  | metavariable when | 
|  | communicating the request information to the script. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.4"> | 
|  | 6.1.4. GATEWAY_INTERFACE | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | This | 
|  | metavariable | 
|  | is set to | 
|  | the dialect of CGI being used | 
|  | by the server to communicate with the script. | 
|  | Syntax: | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | GATEWAY_INTERFACE = "CGI" "/" major "." minor | 
|  | major             = 1*digit | 
|  | minor             = 1*digit | 
|  | </PRE> | 
|  | <P> | 
|  | Note that the major and minor numbers are treated as separate | 
|  | integers and hence each may be | 
|  | more than a single | 
|  | digit. Thus CGI/2.4 is a lower version than CGI/2.13 which in turn | 
|  | is lower than CGI/12.3. Leading zeros in either | 
|  | the major or the minor number MUST be ignored by scripts and | 
|  | SHOULD NOT be generated by servers. | 
|  | </P> | 
|  | <P> | 
|  | This document defines the 1.1 version of the CGI interface | 
|  | ("CGI/1.1"). | 
|  | </P> | 
|  | <P> | 
|  | Servers MUST provide this metavariable | 
|  | to scripts. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.5"> | 
|  | 6.1.5. Protocol-Specific Metavariables | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | These metavariables are specific to | 
|  | the protocol | 
|  | <EM>via</EM> which the request is made. | 
|  | Interpretation of these variables depends on the value of | 
|  | the | 
|  | SERVER_PROTOCOL | 
|  | metavariable | 
|  | (see | 
|  | <A HREF="#6.1.17">section 6.1.17</A>). | 
|  | </P> | 
|  | <P> | 
|  | Metavariables | 
|  | with names beginning with "HTTP_" contain | 
|  | values from the request header, if the | 
|  | scheme used was HTTP. | 
|  | Each | 
|  | HTTP header field name is converted to upper case, has all occurrences of | 
|  | "-" replaced with "_", | 
|  | and has "HTTP_" prepended to  form | 
|  | the metavariable name. | 
|  | Similar transformations are applied for other | 
|  | protocols. | 
|  | The header data MAY be presented as sent | 
|  | by the client, or MAY be rewritten in ways which do not change its | 
|  | semantics. If multiple header fields with the same field-name are received | 
|  | then  the server | 
|  | MUST  rewrite them as though they | 
|  | had been received as a single header field having the same | 
|  | semantics before being represented in a | 
|  | metavariable. | 
|  | Similarly, a header field that is received on more than one line | 
|  | MUST be merged into a single line. The server MUST, if necessary, | 
|  | change the representation of the data (for example, the character | 
|  | set) to be appropriate for a CGI | 
|  | metavariable. | 
|  | <!-- ###NOTE: See if 2068 describes this thoroughly, and | 
|  | point there if so. --> | 
|  | </P> | 
|  | <P> | 
|  | Servers are | 
|  | not required to create | 
|  | metavariables for all | 
|  | the request | 
|  | header fields that they | 
|  | receive. In particular, | 
|  | they MAY | 
|  | decline to make available any | 
|  | header fields carrying authentication information, such as | 
|  | "<SAMP>Authorization</SAMP>", or | 
|  | which are available to the script | 
|  | <EM>via</EM> other metavariables, | 
|  | such as "<SAMP>Content-Length</SAMP>" and "<SAMP>Content-Type</SAMP>". | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.6"> | 
|  | 6.1.6. PATH_INFO | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | The PATH_INFO | 
|  | metavariable | 
|  | specifies | 
|  | a path to be interpreted by the CGI script. It identifies the | 
|  | resource or sub-resource to be returned | 
|  | by the CGI | 
|  | script, and it is derived from the portion | 
|  | of the URI path following the script name but preceding | 
|  | any query data. | 
|  | The syntax | 
|  | and semantics are similar to a decoded HTTP URL | 
|  | 'path' token | 
|  | (defined in | 
|  | RFC 2396 | 
|  | [<A HREF="#[4]">4</A>]), with the exception | 
|  | that a PATH_INFO of "/" | 
|  | represents a single void path segment. | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | PATH_INFO = "" | ( "/" path ) | 
|  | path      = segment *( "/" segment ) | 
|  | segment   = *pchar | 
|  | pchar     = <any CHAR except "/"> | 
|  | </PRE> | 
|  | <P> | 
|  | The PATH_INFO string is the trailing part of the <path> component of | 
|  | the Script-URI | 
|  | (see <A HREF="#3.2">section 3.2</A>) | 
|  | that follows the SCRIPT_NAME | 
|  | portion of the path. | 
|  | </P> | 
|  | <P> | 
|  | Servers MAY impose their own restrictions and | 
|  | limitations on what values they will accept for PATH_INFO, and MAY | 
|  | reject or edit any values they | 
|  | consider objectionable before passing | 
|  | them to the script. | 
|  | </P> | 
|  | <P> | 
|  | Servers MUST make this URI component available | 
|  | to CGI scripts.  The PATH_INFO | 
|  | value is case-sensitive, and the | 
|  | server MUST preserve the case of the PATH_INFO element of the URI | 
|  | when making it available to scripts. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.7"> | 
|  | 6.1.7. PATH_TRANSLATED | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | PATH_TRANSLATED is derived by taking any path-info component of the | 
|  | request URI (see | 
|  | <A HREF="#6.1.6">section 6.1.6</A>), decoding it | 
|  | (see <A HREF="#3.1">section 3.1</A>), parsing it as a URI in its own | 
|  | right, and performing any virtual-to-physical | 
|  | translation appropriate to map it onto the | 
|  | server's document repository structure. | 
|  | If the request URI includes no path-info | 
|  | component, the PATH_TRANSLATED metavariable SHOULD NOT be defined. | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | PATH_TRANSLATED = *CHAR | 
|  | </PRE> | 
|  | <P> | 
|  | For a request such as the following: | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | http://somehost.com/cgi-bin/somescript/this%2eis%2epath%2einfo | 
|  | </PRE> | 
|  | <P> | 
|  | the PATH_INFO component would be decoded, and the result | 
|  | parsed as though it were a request for the following: | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | http://somehost.com/this.is.the.path.info | 
|  | </PRE> | 
|  | <P> | 
|  | This would then be translated to a | 
|  | location in the server's document repository, | 
|  | perhaps a filesystem path something | 
|  | like this: | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | /usr/local/www/htdocs/this.is.the.path.info | 
|  | </PRE> | 
|  | <P> | 
|  | The result of the translation is the value of PATH_TRANSLATED. | 
|  | </P> | 
|  | <P> | 
|  | The value of PATH_TRANSLATED may or may not map to a valid | 
|  | repository | 
|  | location. | 
|  | Servers MUST preserve the case of the path-info | 
|  | segment if and only if the underlying | 
|  | repository | 
|  | supports case-sensitive | 
|  | names.  If the | 
|  | repository | 
|  | is only case-aware, case-preserving, or case-blind | 
|  | with regard to | 
|  | document names, | 
|  | servers are not required to preserve the | 
|  | case of the original segment through the translation. | 
|  | </P> | 
|  | <P> | 
|  | The | 
|  | translation | 
|  | algorithm the server uses to derive PATH_TRANSLATED is | 
|  | implementation defined; CGI scripts which use this variable may | 
|  | suffer limited portability. | 
|  | </P> | 
|  | <P> | 
|  | Servers SHOULD provide this metavariable | 
|  | to scripts if and only if the request URI includes a | 
|  | path-info component. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.8"> | 
|  | 6.1.8. QUERY_STRING | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | A URL-encoded | 
|  | string; the <query> part of the | 
|  | Script-URI. | 
|  | (See | 
|  | <A HREF="#3.2">section 3.2</A>.) | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | QUERY_STRING = query-string | 
|  | query-string = *uric | 
|  | </PRE> | 
|  | <P> | 
|  | The URL syntax for a  query | 
|  | string is described in | 
|  | section 3 of | 
|  | RFC 2396 | 
|  | [<A HREF="#[4]">4</A>]. | 
|  | </P> | 
|  | <P> | 
|  | Servers MUST supply this value to scripts. | 
|  | The QUERY_STRING value is case-sensitive. | 
|  | If the Script-URI does not include a query component, | 
|  | the QUERY_STRING metavariable MUST be defined as an empty string (""). | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.9"> | 
|  | 6.1.9. REMOTE_ADDR | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | The IP address of the client | 
|  | sending the request to the server. This | 
|  | is not necessarily that of the user | 
|  | agent | 
|  | (such as if the request came through a proxy). | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | REMOTE_ADDR  = hostnumber | 
|  | hostnumber   = ipv4-address | ipv6-address | 
|  | </PRE> | 
|  | <P> | 
|  | The definitions of <SAMP>ipv4-address</SAMP> and <SAMP>ipv6-address</SAMP> | 
|  | are provided in Appendix B of RFC 2373 [<A HREF="#[13]">13</A>]. | 
|  | </P> | 
|  | <P> | 
|  | Servers MUST supply this value to scripts. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.10"> | 
|  | 6.1.10. REMOTE_HOST | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | The fully qualified domain name of the | 
|  | client sending the request to | 
|  | the server, if available, otherwise NULL. | 
|  | (See <A HREF="#6.1.9">section 6.1.9</A>.) | 
|  | Fully qualified domain names take the form as described in | 
|  | section 3.5 of RFC 1034 [<A HREF="#[10]">10</A>] and section 2.1 of | 
|  | RFC 1123 [<A HREF="#[5]">5</A>].  Domain names are not case sensitive. | 
|  | </P> | 
|  | <P> | 
|  | Servers SHOULD provide this information to | 
|  | scripts. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.11"> | 
|  | 6.1.11. REMOTE_IDENT | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | The identity information reported about the connection by a | 
|  | RFC 1413 [<A HREF="#[11]">11</A>] request to the remote agent, if | 
|  | available. Servers | 
|  | MAY choose not | 
|  | to support this feature, or not to request the data | 
|  | for efficiency reasons. | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | REMOTE_IDENT = *CHAR | 
|  | </PRE> | 
|  | <P> | 
|  | The data returned | 
|  | may be used for authentication purposes, but the level | 
|  | of trust reposed in them should be minimal. | 
|  | </P> | 
|  | <P> | 
|  | Servers MAY supply this information to scripts if the | 
|  | RFC1413 [<A HREF="#[11]">11</A>] lookup is performed. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.12"> | 
|  | 6.1.12. REMOTE_USER | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | If the request required authentication using the "Basic" | 
|  | mechanism (<EM>i.e.</EM>, the AUTH_TYPE | 
|  | metavariable is set | 
|  | to "Basic"), then the value of the REMOTE_USER | 
|  | metavariable is set to the | 
|  | user-ID supplied.  In all other cases | 
|  | the value of this metavariable | 
|  | is undefined. | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | REMOTE_USER = *OCTET | 
|  | </PRE> | 
|  | <P> | 
|  | This variable is specific to requests made <EM>via</EM> the | 
|  | HTTP protocol. | 
|  | </P> | 
|  | <P> | 
|  | Servers SHOULD provide this metavariable | 
|  | to scripts. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.13"> | 
|  | 6.1.13. REQUEST_METHOD | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | The REQUEST_METHOD | 
|  | metavariable | 
|  | is set to the | 
|  | method with which the request was made, as described in section | 
|  | 5.1.1 of the HTTP/1.0 specification [<A HREF="#[3]">3</A>] and | 
|  | section 5.1.1 of the | 
|  | HTTP/1.1 specification [<A HREF="#[8]">8</A>]. | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | REQUEST_METHOD   = http-method | 
|  | http-method      = "GET" | "HEAD" | "POST" | "PUT" | "DELETE" | 
|  | | "OPTIONS" | "TRACE" | extension-method | 
|  | extension-method = token | 
|  | </PRE> | 
|  | <P> | 
|  | The method is case sensitive. | 
|  | CGI/1.1 servers MAY choose to process some methods | 
|  | directly rather than passing them to scripts. | 
|  | </P> | 
|  | <P> | 
|  | This variable is specific to requests made with HTTP. | 
|  | </P> | 
|  | <P> | 
|  | Servers MUST provide this metavariable | 
|  | to scripts. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.14"> | 
|  | 6.1.14. SCRIPT_NAME | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | The SCRIPT_NAME | 
|  | metavariable | 
|  | is | 
|  | set to a URL path that could identify the CGI script (rather than the | 
|  | script's | 
|  | output). The syntax and semantics are identical to a | 
|  | decoded HTTP URL 'path' token | 
|  | (see RFC 2396 | 
|  | [<A HREF="#[4]">4</A>]). | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | SCRIPT_NAME = "" | ( "/" [ path ] ) | 
|  | </PRE> | 
|  | <P> | 
|  | The SCRIPT_NAME string is some leading part of the <path> component | 
|  | of the Script-URI derived in some | 
|  | implementation defined manner. | 
|  | No PATH_INFO or QUERY_STRING segments | 
|  | (see sections <A HREF="#6.1.6">6.1.6</A> and | 
|  | <A HREF="#6.1.8">6.1.8</A>) are included | 
|  | in the SCRIPT_NAME value. | 
|  | </P> | 
|  | <P> | 
|  | Servers MUST provide this metavariable | 
|  | to scripts. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.15"> | 
|  | 6.1.15. SERVER_NAME | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | The SERVER_NAME | 
|  | metavariable | 
|  | is set to the | 
|  | name  of the | 
|  | server, as | 
|  | derived from the <host> part of the | 
|  | Script-URI | 
|  | (see <A HREF="#3.2">section 3.2</A>). | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | SERVER_NAME = hostname | hostnumber | 
|  | </PRE> | 
|  | <P> | 
|  | Servers MUST provide this metavariable | 
|  | to scripts. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.16"> | 
|  | 6.1.16. SERVER_PORT | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | The SERVER_PORT | 
|  | metavariable | 
|  | is set to the | 
|  | port on which the | 
|  | request was received, as used in the <port> | 
|  | part of the Script-URI. | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | SERVER_PORT = 1*digit | 
|  | </PRE> | 
|  | <P> | 
|  | If the <port> portion of the script-URI is blank, the actual | 
|  | port number upon which the request was received MUST be supplied. | 
|  | </P> | 
|  | <P> | 
|  | Servers MUST provide this metavariable | 
|  | to scripts. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.17"> | 
|  | 6.1.17. SERVER_PROTOCOL | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | The SERVER_PROTOCOL | 
|  | metavariable | 
|  | is set to | 
|  | the | 
|  | name and revision of the information protocol with which | 
|  | the | 
|  | request | 
|  | arrived.  This is not necessarily the same as the protocol version used by | 
|  | the server in its response to the client. | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | SERVER_PROTOCOL   = HTTP-Version | extension-version | 
|  | | extension-token | 
|  | HTTP-Version      = "HTTP" "/" 1*digit "." 1*digit | 
|  | extension-version = protocol "/" 1*digit "." 1*digit | 
|  | protocol          = 1*( alpha | digit | "+" | "-" | "." ) | 
|  | extension-token   = token | 
|  | </PRE> | 
|  | <P> | 
|  | 'protocol' is a version of the <scheme> part of the | 
|  | Script-URI, but is | 
|  | not identical to it.  For example, the scheme of a request may be | 
|  | "<SAMP>https</SAMP>" while the protocol remains "<SAMP>http</SAMP>". | 
|  | The protocol is not case sensitive, but | 
|  | by convention, 'protocol' is in | 
|  | upper case. | 
|  | </P> | 
|  | <P> | 
|  | A well-known extension token value is "INCLUDED", | 
|  | which signals that the current document is being included as part of | 
|  | a composite document, rather than being the direct target of the | 
|  | client request. | 
|  | </P> | 
|  | <P> | 
|  | Servers MUST provide this metavariable | 
|  | to scripts. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="6.1.18"> | 
|  | 6.1.18. SERVER_SOFTWARE | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | The SERVER_SOFTWARE | 
|  | metavariable | 
|  | is set to the | 
|  | name and version of the information server software answering the | 
|  | request (and running the gateway). | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | SERVER_SOFTWARE = 1*product | 
|  | product         = token [ "/" product-version ] | 
|  | product-version = token | 
|  | </PRE> | 
|  | <P> | 
|  | Servers MUST provide this metavariable | 
|  | to scripts. | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="6.2"> | 
|  | 6.2. Request Message-Bodies | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | As there may be a data entity attached to the request, there MUST be | 
|  | a system defined method for the script to read | 
|  | these data. Unless | 
|  | defined otherwise, this will be <EM>via</EM> the 'standard input' file | 
|  | descriptor. | 
|  | </P> | 
|  | <P> | 
|  | If the CONTENT_LENGTH value (see <A HREF="#6.1.2">section 6.1.2</A>) | 
|  | is non-NULL, the server MUST supply at least that many bytes to | 
|  | scripts on the standard input stream. | 
|  | Scripts are | 
|  | not obliged to read the data. | 
|  | Servers MAY signal an EOF condition after CONTENT_LENGTH bytes have been | 
|  | read, but are | 
|  | not obligated to do so.  Therefore, scripts | 
|  | MUST NOT | 
|  | attempt to read more than CONTENT_LENGTH bytes, even if more data | 
|  | are available. | 
|  | </P> | 
|  | <P> | 
|  | For non-parsed header (NPH) scripts (see | 
|  | <A HREF="#7.1">section 7.1</A> | 
|  | below), | 
|  | servers SHOULD | 
|  | attempt to ensure that the data | 
|  | supplied to the script are precisely | 
|  | as supplied by the client and unaltered by | 
|  | the server. | 
|  | </P> | 
|  | <P> | 
|  | <A HREF="#8.1.2">Section 8.1.2</A> describes the requirements of | 
|  | servers with regard to requests that include | 
|  | message-bodies. | 
|  | </P> | 
|  |  | 
|  | <H2> | 
|  | <A NAME="7.0"> | 
|  | 7. Data Output from the CGI Script | 
|  | </A> | 
|  | </H2> | 
|  | <P> | 
|  | There MUST be a system defined method for the script to send data | 
|  | back to the server or client; a script MUST always return some data. | 
|  | Unless defined otherwise, this will be <EM>via</EM> the 'standard | 
|  | output' file descriptor. | 
|  | </P> | 
|  | <P> | 
|  | There are two forms of output that  scripts can supply to servers: non-parsed | 
|  | header (NPH) output, and parsed header output. | 
|  | Servers MUST support parsed header | 
|  | output and MAY support NPH output.  The method of | 
|  | distinguishing between the two | 
|  | types of output (or scripts) is implementation defined. | 
|  | </P> | 
|  | <P> | 
|  | Servers MAY implement a timeout period within which data must be | 
|  | received from scripts.  If a server implementation defines such | 
|  | a timeout and receives no data from a script within the timeout | 
|  | period, the server MAY terminate the script process and SHOULD | 
|  | abort the client request with | 
|  | either a | 
|  | '504 Gateway Timed Out' or a | 
|  | '500 Internal Server Error' response. | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="7.1"> | 
|  | 7.1. Non-Parsed Header Output | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | Scripts using the NPH output form | 
|  | MUST return a complete HTTP response message, as described | 
|  | in Section 6 of the HTTP specifications | 
|  | [<A HREF="#[3]">3</A>,<A HREF="#[8]">8</A>]. | 
|  | NPH scripts | 
|  | MUST use the SERVER_PROTOCOL variable to determine the appropriate format | 
|  | for a response. | 
|  | </P> | 
|  | <P> | 
|  | Servers | 
|  | SHOULD attempt to ensure that the script output is sent | 
|  | directly to the client, with minimal | 
|  | internal and no transport-visible | 
|  | buffering. | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="7.2"> | 
|  | 7.2. Parsed Header Output | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | Scripts using the parsed header output form MUST supply | 
|  | a CGI response message to the server | 
|  | as follows: | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | CGI-Response   = *optional-field CGI-Field *optional-field NL [ Message-Body ] | 
|  | optional-field = ( CGI-Field | HTTP-Field ) | 
|  | CGI-Field      = Content-type | 
|  | | Location | 
|  | | Status | 
|  | | extension-header | 
|  | </PRE> | 
|  | <P><!-- ##### If HTTP defines x-headers, remove ours except x-cgi- --> | 
|  | The response comprises a header and a body, separated by a blank line. | 
|  | The body may be NULL. | 
|  | The header fields are either CGI header fields to be interpreted by | 
|  | the server, or HTTP header fields | 
|  | to be included in the response returned | 
|  | to the client | 
|  | if the request method is HTTP. At least one | 
|  | CGI-Field MUST be | 
|  | supplied, but no CGI  field name may be used more than once | 
|  | in a response. | 
|  | If a body is supplied, then a "<SAMP>Content-type</SAMP>" | 
|  | header field MUST be | 
|  | supplied by the script, | 
|  | otherwise the script MUST send a "<SAMP>Location</SAMP>" | 
|  | or "<SAMP>Status</SAMP>" header field. If a | 
|  | <SAMP>Location</SAMP> CGI-Field | 
|  | is returned, then the script MUST NOT supply | 
|  | any HTTP-Fields. | 
|  | </P> | 
|  | <P> | 
|  | Each header field in a CGI-Response MUST be specified on a single line; | 
|  | CGI/1.1 does not support continuation lines. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="7.2.1"> | 
|  | 7.2.1. CGI header fields | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | The CGI header fields have the generic syntax: | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | generic-field  = field-name ":" [ field-value ] NL | 
|  | field-name     = token | 
|  | field-value    = *( field-content | LWSP ) | 
|  | field-content  = *( token | tspecial | quoted-string ) | 
|  | </PRE> | 
|  | <P> | 
|  | The field-name is not case sensitive; a NULL field value is | 
|  | equivalent to the header field not being sent. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="7.2.1.1"> | 
|  | 7.2.1.1. Content-Type | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | The Internet Media Type [<A HREF="#[9]">9</A>] of the entity | 
|  | body, which is to be sent unmodified to the client. | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | Content-Type = "Content-Type" ":" media-type NL | 
|  | </PRE> | 
|  | <P> | 
|  | This is actually an HTTP-Field | 
|  | rather than a CGI-Field, but | 
|  | it is listed here because of its importance in the CGI dialogue as | 
|  | a member of the "one of these is required" set of header | 
|  | fields. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="7.2.1.2"> | 
|  | 7.2.1.2. Location | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | This is used to specify to the server that the script is returning a | 
|  | reference to a document rather than an actual document. | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | Location         = "Location" ":" | 
|  | ( fragment-URI | rel-URL-abs-path ) NL | 
|  | fragment-URI     = URI [ # fragmentid ] | 
|  | URI              = scheme ":" *qchar | 
|  | fragmentid       = *qchar | 
|  | rel-URL-abs-path = "/" [ hpath ] [ "?" query-string ] | 
|  | hpath            = fpsegment *( "/" psegment ) | 
|  | fpsegment        = 1*hchar | 
|  | psegment         = *hchar | 
|  | hchar            = alpha | digit | safe | extra | 
|  | | ":" | "@" | "& | "=" | 
|  | </PRE> | 
|  | <P> | 
|  | The Location | 
|  | value is either an absolute URI with optional fragment, | 
|  | as defined in RFC 1630 [<A HREF="#[1]">1</A>], or an absolute path | 
|  | within the server's URI space (<EM>i.e.</EM>, | 
|  | omitting the scheme and network-related fields) and optional | 
|  | query-string. If an absolute URI is returned by the script, | 
|  | then the | 
|  | server MUST generate a | 
|  | '302 redirect' HTTP response | 
|  | message unless the script has supplied an | 
|  | explicit Status response header field. | 
|  | Scripts returning an absolute URI MAY choose to | 
|  | provide a message-body.  Servers MUST make any appropriate modifications | 
|  | to the script's output to ensure the response to the user-agent complies | 
|  | with the response protocol version. | 
|  | If the Location value is a path, then the server | 
|  | MUST generate | 
|  | the response that it would have produced in response to a request | 
|  | containing the URL | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | scheme "://" SERVER_NAME ":" SERVER_PORT rel-URL-abs-path | 
|  | </PRE> | 
|  | <P> | 
|  | Note: If the request was accompanied by a | 
|  | message-body | 
|  | (such as for a POST request), and the script | 
|  | redirects the request with a Location field, the | 
|  | message-body | 
|  | may not be | 
|  | available to the resource that is the target of the redirect. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="7.2.1.3"> | 
|  | 7.2.1.3. Status | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | The "<SAMP>Status</SAMP>" header field is used to indicate to the server what | 
|  | status code the server MUST use in the response message. | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | Status        = "Status" ":" digit digit digit SP reason-phrase NL | 
|  | reason-phrase = *<CHAR, excluding CTLs, NL> | 
|  | </PRE> | 
|  | <P> | 
|  | The valid status codes are listed in section 6.1.1 of the HTTP/1.0 | 
|  | specifications [<A HREF="#[3]">3</A>]. If the SERVER_PROTOCOL is | 
|  | "HTTP/1.1", then the status codes defined in the HTTP/1.1 | 
|  | specification [<A HREF="#[8]">8</A>] may | 
|  | be used. If the script does not return a "<SAMP>Status</SAMP>" header | 
|  | field, then "200 OK" SHOULD be assumed by the server. | 
|  | </P> | 
|  | <P> | 
|  | If a script is being used to handle a particular error or condition | 
|  | encountered by the server, such as a '404 Not Found' error, the script | 
|  | SHOULD use the "<SAMP>Status</SAMP>" CGI header field to propagate the error | 
|  | condition back to the client.  <EM>E.g.</EM>, in the example mentioned it | 
|  | SHOULD include a "Status: 404 Not Found" in the | 
|  | header data returned to the server. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="7.2.1.4"> | 
|  | 7.2.1.4. Extension header fields | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | Scripts MAY include in their CGI response header additional fields | 
|  | not defined in this or the HTTP specification. | 
|  | These are called "extension" fields, | 
|  | and have the syntax of a <SAMP>generic-field</SAMP> as defined in | 
|  | <A HREF="#7.2.1">section 7.2.1</A>.  The name of an extension field | 
|  | MUST NOT conflict with a field name defined in this or any other | 
|  | specification; extension field names SHOULD begin with "X-CGI-" | 
|  | to ensure uniqueness. | 
|  | </P> | 
|  |  | 
|  | <H4> | 
|  | <A NAME="7.2.2"> | 
|  | 7.2.2. HTTP header fields | 
|  | </A> | 
|  | </H4> | 
|  | <P> | 
|  | The script MAY return any other header fields defined by the | 
|  | specification | 
|  | for the SERVER_PROTOCOL (HTTP/1.0 [<A HREF="#[3]">3</A>] or HTTP/1.1 | 
|  | [<A HREF="#[8]">8</A>]). | 
|  | Servers MUST resolve conflicts beteen CGI header | 
|  | and HTTP header formats or names (see <A HREF="#8.0">section 8</A>). | 
|  | </P> | 
|  |  | 
|  | <H2> | 
|  | <A NAME="8.0"> | 
|  | 8. Server Implementation | 
|  | </A> | 
|  | </H2> | 
|  | <P> | 
|  | This section defines the requirements that must be met by HTTP | 
|  | servers in order to provide a coherent and correct CGI/1.1 | 
|  | environment in which scripts may function.  It is intended | 
|  | primarily for server implementors, but it is useful for | 
|  | script authors to be familiar with the information as well. | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="8.1"> | 
|  | 8.1. Requirements for Servers | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | In order to be considered CGI/1.1-compliant, a server must meet | 
|  | certain basic criteria and provide certain minimal functionality. | 
|  | The details of these requirements are described in the following sections. | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="8.1.1"> | 
|  | 8.1.1. Script-URI | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | Servers MUST support the standard mechanism (described below) which | 
|  | allows | 
|  | script authors to determine | 
|  | what URL to use in documents | 
|  | which reference the script; | 
|  | specifically, what URL to use in order to | 
|  | achieve particular settings of the | 
|  | metavariables. This | 
|  | mechanism is as follows: | 
|  | </P> | 
|  | <P> | 
|  | The server | 
|  | MUST translate the header data from the CGI header field syntax to | 
|  | the HTTP | 
|  | header field syntax if these differ. For example, the character | 
|  | sequence for | 
|  | newline (such as Unix's ASCII NL) used by CGI scripts may not be the | 
|  | same as that used by HTTP (ASCII CR followed by LF). The server MUST | 
|  | also resolve any conflicts between header fields returned by the script | 
|  | and header fields that it would otherwise send itself. | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="8.1.2"> | 
|  | 8.1.2. Request Message-body Handling | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | These are the requirements for server handling of message-bodies directed | 
|  | to CGI/1.1 resources: | 
|  | </P> | 
|  | <OL> | 
|  | <LI>The message-body the server provides to the CGI script MUST | 
|  | have any transfer encodings removed. | 
|  | </LI> | 
|  | <LI>The server MUST derive and provide a value for the CONTENT_LENGTH | 
|  | metavariable that reflects the length of the message-body after any | 
|  | transfer decoding. | 
|  | </LI> | 
|  | <LI>The server MUST leave intact any content-encodings of the message-body. | 
|  | </LI> | 
|  | </OL> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="8.1.3"> | 
|  | 8.1.3. Required Metavariables | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | Servers MUST provide scripts with certain information and | 
|  | metavariables | 
|  | as described in <A HREF="#8.3">section 8.3</A>. | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="8.1.4"> | 
|  | 8.1.4. Response Compliance | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | Servers MUST ensure that responses sent to the user-agent meet all | 
|  | requirements of the protocol level in effect.  This may involve | 
|  | modifying, deleting, or augmenting any header | 
|  | fields and/or message-body supplied by the script. | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="8.2"> | 
|  | 8.2. Recommendations for Servers | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | Servers SHOULD provide the "<SAMP>query</SAMP>" component of the script-URI | 
|  | as command-line arguments to scripts if it does not | 
|  | contain any unencoded '=' characters and the command-line arguments can | 
|  | be generated in an unambiguous manner. | 
|  | (See <A HREF="#5.0">section 5</A>.) | 
|  | </P> | 
|  | <P> | 
|  | Servers SHOULD set the AUTH_TYPE | 
|  | metavariable to the value of the | 
|  | '<SAMP>auth-scheme</SAMP>' token of the "<SAMP>Authorization</SAMP>" | 
|  | field if it was supplied as part of the request header. | 
|  | (See <A HREF="#6.1.1">section 6.1.1</A>.) | 
|  | </P> | 
|  | <P> | 
|  | Where applicable, servers SHOULD set the current working directory | 
|  | to the directory in which the script is located before invoking | 
|  | it. | 
|  | </P> | 
|  | <P> | 
|  | Servers MAY reject with error '404 Not Found' | 
|  | any requests that would result in | 
|  | an encoded "/" being decoded into PATH_INFO or SCRIPT_NAME, as this | 
|  | might represent a loss of information to the script. | 
|  | </P> | 
|  | <P> | 
|  | Although the server and the CGI script need not be consistent in | 
|  | their handling of URL paths (client URLs and the PATH_INFO data, | 
|  | respectively), server authors may wish to impose consistency. | 
|  | So the server implementation SHOULD define its behaviour for the | 
|  | following cases: | 
|  | </P> | 
|  | <OL> | 
|  | <LI>define any restrictions on allowed characters, in particular | 
|  | whether ASCII NUL is permitted; | 
|  | </LI> | 
|  | <LI>define any restrictions on allowed path segments, in particular | 
|  | whether non-terminal NULL segments are permitted; | 
|  | </LI> | 
|  | <LI>define the behaviour for <SAMP>"."</SAMP> or <SAMP>".."</SAMP> path | 
|  | segments; <EM>i.e.</EM>, whether they are prohibited, treated as | 
|  | ordinary path | 
|  | segments or interpreted in accordance with the relative URL | 
|  | specification [<A HREF="#[7]">7</A>]; | 
|  | </LI> | 
|  | <LI>define any limits of the implementation, including limits on path or | 
|  | search string lengths, and limits on the volume of header data the server | 
|  | will parse. | 
|  | </LI><!-- ##### Move the field resolution/translation para below here --> | 
|  | </OL> | 
|  | <P> | 
|  | Servers MAY generate the | 
|  | Script-URI in | 
|  | any way from the client URI, | 
|  | or from any other data (but the behaviour SHOULD be documented). | 
|  | </P> | 
|  | <P> | 
|  | For non-parsed header (NPH) scripts (see | 
|  | <A HREF="#7.1">section 7.1</A>), servers SHOULD | 
|  | attempt to ensure that the script input comes directly from the | 
|  | client, with minimal buffering. For all scripts the data will be | 
|  | as supplied by the client. | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="8.3"> | 
|  | 8.3. Summary of | 
|  | MetaVariables | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | Servers MUST provide the following | 
|  | metavariables to | 
|  | scripts.  See the individual descriptions for exceptions and semantics. | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | CONTENT_LENGTH (section <A HREF="#6.1.2">6.1.2</A>) | 
|  | CONTENT_TYPE (section <A HREF="#6.1.3">6.1.3</A>) | 
|  | GATEWAY_INTERFACE (section <A HREF="#6.1.4">6.1.4</A>) | 
|  | PATH_INFO (section <A HREF="#6.1.6">6.1.6</A>) | 
|  | QUERY_STRING (section <A HREF="#6.1.8">6.1.8</A>) | 
|  | REMOTE_ADDR (section <A HREF="#6.1.9">6.1.9</A>) | 
|  | REQUEST_METHOD (section <A HREF="#6.1.13">6.1.13</A>) | 
|  | SCRIPT_NAME (section <A HREF="#6.1.14">6.1.14</A>) | 
|  | SERVER_NAME (section <A HREF="#6.1.15">6.1.15</A>) | 
|  | SERVER_PORT (section <A HREF="#6.1.16">6.1.16</A>) | 
|  | SERVER_PROTOCOL (section <A HREF="#6.1.17">6.1.17</A>) | 
|  | SERVER_SOFTWARE (section <A HREF="#6.1.18">6.1.18</A>) | 
|  | </PRE> | 
|  | <P> | 
|  | Servers SHOULD define the following | 
|  | metavariables for scripts. | 
|  | See the individual descriptions for exceptions and semantics. | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | AUTH_TYPE (section <A HREF="#6.1.1">6.1.1</A>) | 
|  | REMOTE_HOST (section <A HREF="#6.1.10">6.1.10</A>) | 
|  | </PRE> | 
|  | <P> | 
|  | In addition, servers SHOULD provide | 
|  | metavariables for all fields present | 
|  | in the HTTP request header, with the exception of those involved with | 
|  | access control.  Servers MAY at their discretion provide | 
|  | metavariables | 
|  | for access control fields. | 
|  | </P> | 
|  | <P> | 
|  | Servers MAY define the following | 
|  | metavariables.  See the individual | 
|  | descriptions for exceptions and semantics. | 
|  | </P><!--#if expr="! $GUI" --> | 
|  | <P></P><!--#endif --> | 
|  | <PRE> | 
|  | PATH_TRANSLATED (section <A HREF="#6.1.7">6.1.7</A>) | 
|  | REMOTE_IDENT (section <A HREF="#6.1.11">6.1.11</A>) | 
|  | REMOTE_USER (section <A HREF="#6.1.12">6.1.12</A>) | 
|  | </PRE> | 
|  | <P> | 
|  | Servers MAY | 
|  | at their discretion define additional implementation-specific | 
|  | extension metavariables | 
|  | provided their names do not | 
|  | conflict with defined header field names.  Implementation-specific | 
|  | metavariable names SHOULD | 
|  | be prefixed with "X_" (<EM>e.g.</EM>, | 
|  | "X_DBA") to avoid the potential for such conflicts. | 
|  | </P> | 
|  |  | 
|  | <H2> | 
|  | <A NAME="9.0"> | 
|  | 9. | 
|  | Script Implementation | 
|  | </A> | 
|  | </H2> | 
|  | <P> | 
|  | This section defines the requirements and recommendations for scripts | 
|  | that are intended to function in a CGI/1.1 environment.  It is intended | 
|  | primarily as a reference for script authors, but server implementors | 
|  | should be familiar with these issues as well. | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="9.1"> | 
|  | 9.1. Requirements for Scripts | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | Scripts using the parsed-header method to communicate with servers | 
|  | MUST supply a response header to the server. | 
|  | (See <A HREF="#7.0">section 7</A>.) | 
|  | </P> | 
|  | <P> | 
|  | Scripts using the NPH method to communicate with servers MUST | 
|  | provide complete HTTP responses, and MUST use the value of the | 
|  | SERVER_PROTOCOL metavariable | 
|  | to determine the appropriate format. | 
|  | (See <A HREF="#7.1">section 7.1</A>.) | 
|  | </P> | 
|  | <P> | 
|  | Scripts MUST check the value of the REQUEST_METHOD | 
|  | metavariable in order | 
|  | to provide an appropriate response. | 
|  | (See <A HREF="#6.1.13">section 6.1.13</A>.) | 
|  | </P> | 
|  | <P> | 
|  | Scripts MUST be prepared to handled URL-encoded values in | 
|  | metavariables. | 
|  | In addition, they MUST recognise both "+" and "%20" in URL-encoded | 
|  | quantities as representing the space character. | 
|  | (See <A HREF="#3.1">section 3.1</A>.) | 
|  | </P> | 
|  | <P> | 
|  | Scripts MUST ignore leading zeros in the major and minor version numbers | 
|  | in the GATEWAY_INTERFACE | 
|  | metavariable value. (See | 
|  | <A HREF="#6.1.4">section 6.1.4</A>.) | 
|  | </P> | 
|  | <P> | 
|  | When processing requests that include a | 
|  | message-body, scripts | 
|  | MUST NOT read more than CONTENT_LENGTH bytes from the input stream. | 
|  | (See sections <A HREF="#6.1.2">6.1.2</A> and <A HREF="#6.2">6.2</A>.) | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="9.2"> | 
|  | 9.2. Recommendations for Scripts | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | Servers may interrupt or terminate script execution at any time | 
|  | and without warning, so scripts SHOULD be prepared to deal with | 
|  | abnormal termination. | 
|  | </P> | 
|  | <P> | 
|  | Scripts MUST | 
|  | reject with | 
|  | error '405 Method Not | 
|  | Allowed' requests | 
|  | made using methods that they do not support. If the script does | 
|  | not intend | 
|  | processing the PATH_INFO data, then it SHOULD reject the request with | 
|  | '404 Not | 
|  | Found' if PATH_INFO is not NULL. | 
|  | </P> | 
|  | <P> | 
|  | If a script is processing the output of a form, it SHOULD | 
|  | verify that the CONTENT_TYPE | 
|  | is "<SAMP>application/x-www-form-urlencoded</SAMP>" [<A HREF="#[2]">2</A>] | 
|  | or whatever other media type is expected. | 
|  | </P> | 
|  | <P> | 
|  | Scripts parsing PATH_INFO, | 
|  | PATH_TRANSLATED, or SCRIPT_NAME | 
|  | SHOULD be careful | 
|  | of void path segments ("<SAMP>//</SAMP>") and special path segments | 
|  | (<SAMP>"."</SAMP> and | 
|  | <SAMP>".."</SAMP>). They SHOULD either be removed from the path before | 
|  | use in OS | 
|  | system calls, or the request SHOULD be rejected with | 
|  | '404 Not Found'. | 
|  | </P> | 
|  | <P> | 
|  | As it is impossible for | 
|  | scripts to determine the client URI that | 
|  | initiated  a | 
|  | request without knowledge of the specific server in | 
|  | use, the script SHOULD NOT return "<SAMP>text/html</SAMP>" | 
|  | documents containing | 
|  | relative URL links without including a "<SAMP><BASE></SAMP>" | 
|  | tag in the document. | 
|  | </P> | 
|  | <P> | 
|  | When returning header fields, | 
|  | scripts SHOULD try to send the CGI | 
|  | header fields (see section | 
|  | <A HREF="#7.2">7.2</A>) as soon as possible, and | 
|  | SHOULD send them | 
|  | before any HTTP header fields. This may | 
|  | help reduce the server's memory requirements. | 
|  | </P> | 
|  |  | 
|  | <H2> | 
|  | <A NAME="10.0"> | 
|  | 10. System Specifications | 
|  | </A> | 
|  | </H2> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="10.1"> | 
|  | 10.1. AmigaDOS | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | The implementation of the CGI on an AmigaDOS operating system platform | 
|  | SHOULD use environment variables as the mechanism of providing | 
|  | request metadata to CGI scripts. | 
|  | </P> | 
|  | <DL> | 
|  | <DT><STRONG>Environment variables</STRONG> | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | These are accessed by the DOS library routine <SAMP>GetVar</SAMP>. The | 
|  | flags argument SHOULD be 0. Case is ignored, but upper case is | 
|  | recommended for compatibility with case-sensitive systems. | 
|  | </P> | 
|  | </DD> | 
|  | <DT><STRONG>The current working directory</STRONG> | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | The current working directory for the script is set to the directory | 
|  | containing the script. | 
|  | </P> | 
|  | </DD> | 
|  | <DT><STRONG>Character set</STRONG> | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | The US-ASCII character set is used for the definition of environment | 
|  | variable names and header | 
|  | field names; the newline (NL) sequence is LF; | 
|  | servers SHOULD also accept CR LF as a newline. | 
|  | </P> | 
|  | </DD> | 
|  | </DL> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="10.2"> | 
|  | 10.2. Unix | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | The implementation of the CGI on a UNIX operating system platform | 
|  | SHOULD use environment variables as the mechanism of providing | 
|  | request metadata to CGI scripts. | 
|  | </P> | 
|  | <P> | 
|  | For Unix compatible operating systems, the following are defined: | 
|  | </P> | 
|  | <DL> | 
|  | <DT><STRONG>Environment variables</STRONG> | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | These are accessed by the C library routine <SAMP>getenv</SAMP>. | 
|  | </P> | 
|  | </DD> | 
|  | <DT><STRONG>The command line</STRONG> | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | This is accessed using the | 
|  | <SAMP>argc</SAMP> and <SAMP>argv</SAMP> | 
|  | arguments to <SAMP>main()</SAMP>. The words have any characters | 
|  | that | 
|  | are 'active' in the Bourne shell escaped with a backslash. | 
|  | If the value of the QUERY_STRING | 
|  | metavariable | 
|  | contains an unencoded equals-sign '=', then the command line | 
|  | SHOULD NOT be used by the script. | 
|  | </P> | 
|  | </DD> | 
|  | <DT><STRONG>The current working directory</STRONG> | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | The current working directory for the script | 
|  | SHOULD be set to the directory | 
|  | containing the script. | 
|  | </P> | 
|  | </DD> | 
|  | <DT><STRONG>Character set</STRONG> | 
|  | </DT> | 
|  | <DD> | 
|  | <P> | 
|  | The US-ASCII character set is used for the definition of environment | 
|  | variable names and header field names; the newline (NL) sequence is LF; | 
|  | servers SHOULD also accept CR LF as a newline. | 
|  | </P> | 
|  | </DD> | 
|  | </DL> | 
|  |  | 
|  | <H2> | 
|  | <A NAME="11.0"> | 
|  | 11. Security Considerations | 
|  | </A> | 
|  | </H2> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="11.1"> | 
|  | 11.1. Safe Methods | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | As discussed in the security considerations of the HTTP | 
|  | specifications [<A HREF="#[3]">3</A>,<A HREF="#[8]">8</A>], the | 
|  | convention has been established that the | 
|  | GET and HEAD methods should be 'safe'; they should cause no | 
|  | side-effects and only have the significance of resource retrieval. | 
|  | </P> | 
|  | <P> | 
|  | CGI scripts are responsible for enforcing any HTTP security considerations | 
|  | [<A HREF="#[3]">3</A>,<A HREF="#[8]">8</A>] | 
|  | with respect to the protocol version level of the request and | 
|  | any side effects generated by the scripts on behalf of | 
|  | the server.  Primary | 
|  | among these | 
|  | are the considerations of safe and idempotent methods.  Idempotent | 
|  | requests are those that may be repeated an arbitrary number of times | 
|  | and produce side effects identical to a single request. | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="11.2"> | 
|  | 11.2. HTTP Header | 
|  | Fields Containing Sensitive Information | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | Some HTTP header fields may carry sensitive information which the server | 
|  | SHOULD NOT pass on to the script unless explicitly configured to do | 
|  | so. For example, if the server protects the script using the | 
|  | "<SAMP>Basic</SAMP>" | 
|  | authentication scheme, then the client will send an | 
|  | "<SAMP>Authorization</SAMP>" | 
|  | header field containing a username and password. If the server, rather | 
|  | than the script, validates this information then the password SHOULD | 
|  | NOT be passed on to the script <EM>via</EM> the HTTP_AUTHORIZATION | 
|  | metavariable | 
|  | without careful consideration. | 
|  | This also applies to the | 
|  | Proxy-Authorization header field and the corresponding | 
|  | HTTP_PROXY_AUTHORIZATION | 
|  | metavariable. | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="11.3"> | 
|  | 11.3. Script | 
|  | Interference with the Server | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | The most common implementation of CGI invokes the script as a child | 
|  | process using the same user and group as the server process. It | 
|  | SHOULD therefore be ensured that the script cannot interfere with the | 
|  | server process, its configuration, or documents. | 
|  | </P> | 
|  | <P> | 
|  | If the script is executed by calling a function linked in to the | 
|  | server software (either at compile-time or run-time) then precautions | 
|  | SHOULD be taken to protect the core memory of the server, or to | 
|  | ensure that untrusted code cannot be executed. | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="11.4"> | 
|  | 11.4. Data Length and Buffering Considerations | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | This specification places no limits on the length of message-bodies | 
|  | presented to the script.  Scripts should not assume that statically | 
|  | allocated buffers of any size are sufficient to contain the entire | 
|  | submission at one time.  Use of a fixed length buffer without careful | 
|  | overflow checking may result in an attacker exploiting 'stack-smashing' | 
|  | or 'stack-overflow' vulnerabilities of the operating system. | 
|  | Scripts may spool large submissions to disk or other buffering media, | 
|  | but a rapid succession of large submissions may result in denial of | 
|  | service conditions.  If the CONTENT_LENGTH of a message-body is larger | 
|  | than resource considerations allow, scripts should respond with an | 
|  | error status appropriate for the protocol version; potentially applicable | 
|  | status codes include '503 Service Unavailable' (HTTP/1.0 and HTTP/1.1), | 
|  | '413 Request Entity Too Large' (HTTP/1.1), and | 
|  | '414 Request-URI Too Long' (HTTP/1.1). | 
|  | </P> | 
|  |  | 
|  | <H3> | 
|  | <A NAME="11.5"> | 
|  | 11.5. Stateless Processing | 
|  | </A> | 
|  | </H3> | 
|  | <P> | 
|  | The stateless nature of the Web makes each script execution and resource | 
|  | retrieval independent of all others even when multiple requests constitute a | 
|  | single conceptual Web transaction.  Because of this, a script should not | 
|  | make any assumptions about the context of the user-agent submitting a | 
|  | request.  In particular, scripts should examine data obtained from the client | 
|  | and verify that they are valid, both in form and content, before allowing | 
|  | them to be used for sensitive purposes such as input to other | 
|  | applications, commands, or operating system services.  These uses | 
|  | include, but are not | 
|  | limited to: system call arguments, database writes, dynamically evaluated | 
|  | source code, and input to billing or other secure processes.  It is important | 
|  | that applications be protected from invalid input regardless of whether | 
|  | the invalidity is the result of user error, logic error, or malicious action. | 
|  | </P> | 
|  | <P> | 
|  | Authors of scripts involved in multi-request transactions should be | 
|  | particularly cautios about validating the state information; | 
|  | undesirable effects may result from the substitution of dangerous | 
|  | values for portions of the submission which might otherwise be | 
|  | presumed safe.  Subversion of this type occurs when alterations | 
|  | are made to data from a prior stage of the transaction that were | 
|  | not meant to be controlled by the client (<EM>e.g.</EM>, hidden | 
|  | HTML form elements, cookies, embedded URLs, <EM>etc.</EM>). | 
|  | </P> | 
|  |  | 
|  | <H2> | 
|  | <A NAME="12.0"> | 
|  | 12. Acknowledgements | 
|  | </A> | 
|  | </H2> | 
|  | <P> | 
|  | This work is based on a draft published in 1997 by David R. Robinson, | 
|  | which in turn was based on the original CGI interface that arose out of | 
|  | discussions on the <EM>www-talk</EM> mailing list. In particular, | 
|  | Rob McCool, John Franks, Ari Luotonen, | 
|  | George Phillips and | 
|  | Tony Sanders deserve special recognition for their efforts in | 
|  | defining and implementing the early versions of this interface. | 
|  | </P> | 
|  | <P> | 
|  | This document has also greatly benefited from the comments and | 
|  | suggestions made by  Chris Adie, Dave Kristol, | 
|  | Mike Meyer, David Morris, Jeremy Madea, | 
|  | Patrick M<SUP>c</SUP>Manus, Adam Donahue, | 
|  | Ross Patterson, and Harald Alvestrand. | 
|  | </P> | 
|  |  | 
|  | <H2> | 
|  | <A NAME="13.0"> | 
|  | 13. References | 
|  | </A> | 
|  | </H2> | 
|  | <DL COMPACT> | 
|  | <DT><A NAME="[1]">[1]</A> | 
|  | </DT> | 
|  | <DD>Berners-Lee, T., 'Universal Resource Identifiers in WWW: A | 
|  | Unifying Syntax for the Expression of Names and Addresses of | 
|  | Objects on the Network as used in the World-Wide Web', RFC 1630, | 
|  | CERN, June 1994. | 
|  | <P> | 
|  | </P> | 
|  | </DD> | 
|  | <DT><A NAME="[2]">[2]</A> | 
|  | </DT> | 
|  | <DD>Berners-Lee, T. and Connolly, D., 'Hypertext Markup Language - | 
|  | 2.0', RFC 1866, MIT/W3C, November 1995. | 
|  | <P> | 
|  | </P> | 
|  | </DD> | 
|  | <DT><A NAME="[3]">[3]</A> | 
|  | </DT> | 
|  | <DD>Berners-Lee, T., Fielding, R. T. and Frystyk, H., | 
|  | 'Hypertext Transfer Protocol -- HTTP/1.0', RFC 1945, MIT/LCS, | 
|  | UC Irvine, May 1996. | 
|  | <P> | 
|  | </P> | 
|  | </DD> | 
|  |  | 
|  | <DT><A NAME="[4]">[4]</A> | 
|  | </DT> | 
|  | <DD>Berners-Lee, T., Fielding, R., and Masinter, L., Editors, | 
|  | 'Uniform Resource Identifiers (URI): Generic Syntax', RFC 2396, | 
|  | MIT, U.C. Irvine, Xerox Corporation, August 1996. | 
|  | <P> | 
|  | </P> | 
|  | </DD> | 
|  |  | 
|  | <DT><A NAME="[5]">[5]</A> | 
|  | </DT> | 
|  | <DD>Braden, R., Editor, 'Requirements for Internet Hosts -- | 
|  | Application and Support', STD 3, RFC 1123, IETF, October 1989. | 
|  | <P> | 
|  | </P> | 
|  | </DD> | 
|  | <DT><A NAME="[6]">[6]</A> | 
|  | </DT> | 
|  | <DD>Crocker, D.H., 'Standard for the Format of ARPA Internet Text | 
|  | Messages', STD 11, RFC 822, University of Delaware, August 1982. | 
|  | <P> | 
|  | </P> | 
|  | </DD> | 
|  | <DT><A NAME="[7]">[7]</A> | 
|  | </DT> | 
|  | <DD>Fielding, R., 'Relative Uniform Resource Locators', RFC 1808, | 
|  | UC Irvine, June 1995. | 
|  | <P> | 
|  | </P> | 
|  | </DD> | 
|  | <DT><A NAME="[8]">[8]</A> | 
|  | </DT> | 
|  | <DD>Fielding, R., Gettys, J., Mogul, J., Frystyk, H. and | 
|  | Berners-Lee, T., 'Hypertext Transfer Protocol -- HTTP/1.1', | 
|  | RFC 2068, UC Irvine, DEC, | 
|  | MIT/LCS, January 1997. | 
|  | <P> | 
|  | </P> | 
|  | </DD> | 
|  | <DT><A NAME="[9]">[9]</A> | 
|  | </DT> | 
|  | <DD>Freed, N. and Borenstein N., 'Multipurpose Internet Mail | 
|  | Extensions (MIME) Part Two: Media Types', RFC 2046, Innosoft, | 
|  | First Virtual, November 1996. | 
|  | <P> | 
|  | </P> | 
|  | </DD> | 
|  | <DT><A NAME="[10]">[10]</A> | 
|  | </DT> | 
|  | <DD>Mockapetris, P., 'Domain Names - Concepts and Facilities', | 
|  | STD 13, RFC 1034, ISI, November 1987. | 
|  | <P> | 
|  | </P> | 
|  | </DD> | 
|  | <DT><A NAME="[11]">[11]</A> | 
|  | </DT> | 
|  | <DD>St. Johns, M., 'Identification Protocol', RFC 1431, US | 
|  | Department of Defense, February 1993. | 
|  | <P> | 
|  | </P> | 
|  | </DD> | 
|  | <DT><A NAME="[12]">[12]</A> | 
|  | </DT> | 
|  | <DD>'Coded Character Set -- 7-bit American Standard Code for | 
|  | Information Interchange', ANSI X3.4-1986. | 
|  | <P> | 
|  | </P> | 
|  | </DD> | 
|  | <DT><A NAME="[13]">[13]</A> | 
|  | </DT> | 
|  | <DD>Hinden, R. and Deering, S., | 
|  | 'IP Version 6 Addressing Architecture', RFC 2373, | 
|  | Nokia, Cisco Systems, | 
|  | July 1998. | 
|  | <P> | 
|  | </P> | 
|  | </DD> | 
|  | </DL> | 
|  |  | 
|  | <H2> | 
|  | <A NAME="14.0"> | 
|  | 14. Authors' Addresses | 
|  | </A> | 
|  | </H2> | 
|  | <ADDRESS> | 
|  | <P> | 
|  | Ken A L Coar | 
|  | <BR> | 
|  | MeepZor Consulting | 
|  | <BR> | 
|  | 7824 Mayfaire Crest Lane, Suite 202 | 
|  | <BR> | 
|  | Raleigh, NC   27615-4875 | 
|  | <BR> | 
|  | U.S.A. | 
|  | </P> | 
|  | <P> | 
|  | Tel: +1 (919) 254.4237 | 
|  | <BR> | 
|  | Fax: +1 (919) 254.5250 | 
|  | <BR> | 
|  | Email: | 
|  | <A | 
|  | HREF="mailto:Ken.Coar@Golux.Com" | 
|  | ><SAMP>Ken.Coar@Golux.Com</SAMP></A> | 
|  | </P> | 
|  | </ADDRESS> | 
|  | <ADDRESS> | 
|  | <P> | 
|  | David Robinson | 
|  | <BR> | 
|  | E*TRADE UK Ltd | 
|  | <BR> | 
|  | Mount Pleasant House | 
|  | <BR> | 
|  | 2 Mount Pleasant | 
|  | <BR> | 
|  | Huntingdon Road | 
|  | <BR> | 
|  | Cambridge CB3 0RN | 
|  | <BR> | 
|  | UK | 
|  | </P> | 
|  | <P> | 
|  | Tel: +44 (1223) 566926 | 
|  | <BR> | 
|  | Fax: +44 (1223) 506288 | 
|  | <BR> | 
|  | Email: | 
|  | <A | 
|  | HREF="mailto:drtr@etrade.co.uk" | 
|  | ><SAMP>drtr@etrade.co.uk</SAMP></A> | 
|  | </ADDRESS> | 
|  |  | 
|  | </BODY> | 
|  | </HTML> |