2675 lines
		
	
	
		
			85 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			2675 lines
		
	
	
		
			85 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!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>
 |