1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674 |
- <!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>
|